7.Adapter-適配器模式

Adapter 適配器模式

  • 適配器:
    也稱包裝樣式或者包裝(wrapper)。將一個類的接口轉接成用戶所期待的。
    一個適配使得因接口不兼容而不能在一起工作的類工作在一起,做法是將類自己的接口包裹在一個已存在的類中。

  • 主要分爲三類:類的適配器模式、對象的適配器模式、接口的適配器模式。
    類適配器是通過類的繼承實現的適配;
    對象適配器是通過對象間的關聯關係,組合關係實現的適配;
    接口適配器用一個抽象類實現該接口所有方法,在繼承該抽象類重寫想要的方法。

  • 適配器模式說明

    1. Target 目標角色 該角色定義把其他類轉換爲何種接口,也就是我們的期望接
      口。
    2. Adaptee 源角色 你想把“誰”轉換成目標角色,這個“誰”就是源角色,它是已經存
      在的、運行良好的類或對象。
    3. Adapter 適配器角色 適配器模式的核心角色,其他兩個角色都是已經存在的角
      色,而適配器角色是需要新建立的,他的職責非常簡單:把源角色轉換爲目標
      角色。
  • 適配器模式優點

    1. 適配器模式可以讓兩個沒有任何關係的類在一起運行,只要適配器這個角色能
      夠搞定他們就成。
    2. 增加了類的透明性。我們訪問的是目標角色,但是實現卻在源角色裏。
    3. 提高了類的複用度。源角色在原有系統中還是可以正常使用的。
    4. 靈活性非常好。不想要適配器時,刪掉這個適配器就好了,其他代碼不用改。

    類適配器示例類圖:
    Adapter1_uml

  • 類適配器示例代碼:

//Target 目標接口,或稱爲標準接口
public interface TargetUSBPort {
    public void onUSB();
}
// PS2圓接口
public interface PS2Port {
    public void onPS2();
}

// Adaptee 具有特殊功能、但不符合我們現有的標準接口的類
public class AdapteePS2Port implements PS2Port {
    @Override
    public void onPS2() {
        System.out.println("PS2接口的鍵盤...");
    }
}

// Adapter 適配器類,繼承了被適配類,同時實現標準接口。(類適配器)
public class AdapterPS2ToUSB extends AdapteePS2Port implements TargetUSBPort {
    @Override
    public void onUSB() {
        System.out.println("類適配器 轉換...");
        this.onPS2();
    }
}

// Client
public class ClientPC {
    public static void main(String[] args) {
        // 類適配器
        TargetUSBPort adapter = new AdapterPS2ToUSB();
        adapter.onUSB();
    }
}
  • 對象適配器示例類圖:
    Adapter2_uml

  • 對象適配器示例代碼:

//Target 目標接口,或稱爲標準接口
public interface TargetUSBPort {
    public void onUSB();
}
// PS2圓接口
public interface PS2Port {
    public void onPS2();
}

// Adaptee 具有特殊功能、但不符合我們現有的標準接口的類
public class AdapteePS2Port implements PS2Port {
    @Override
    public void onPS2() {
        System.out.println("PS2接口的鍵盤...");
    }
}

// Adapter 適配器類,直接關聯被適配類。(對象適配器)
public class AdapterPS2ToUSB2 implements TargetUSBPort {
    private PS2Port ps2Port;

    // 通過構造函數傳入具體需要適配的被適配類對象
    public AdapterPS2ToUSB2(PS2Port ps2Port) {
        this.ps2Port = ps2Port;
    }

    @Override
    public void onUSB() {
        System.out.println("轉換...");
        // 使用委託的方式完成特殊功能
        ps2Port.onPS2();
    }
}

// Client
public class ClientPC {
    public static void main(String[] args) {
        // 對象適配器
        PS2Port adaptee = new AdapteePS2Port();
        TargetUSBPort adapter2 = new AdapterPS2ToUSB2(adaptee);
        adapter2.onUSB();
    }
}
  • 接口適配器示例:
    可以讓用戶更加方便的使用該接口,比如一個接口有很多方法,而只需要實現其中一兩個方法,其他方法也不得不實現帶來不必要的麻煩。
    在GUI編程是經常遇到這類問題,比如 java.awt.event.WindowListener 有7個方法
    windowOpened(WindowEvent)
    windowClosing(WindowEvent)
    windowClosed(WindowEvent)
    windowIconified(WindowEvent)
    windowDeiconified(WindowEvent)
    windowActivated(WindowEvent)
    windowDeactivated(WindowEvent)
    所以提供了
    java.awt.event.WindowAdapter implements WindowListener, WindowStateListener, WindowFocusListener
    WindowAdapter方便了我們編寫代碼,只需要繼承重寫想要的方法即可。
發佈了38 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章