1. 程式人生 > >設計模式(8)適配器模式

設計模式(8)適配器模式

設計模式 gif span ring .com 接口 interface abstract 關閉

適配器模式可以將一個類的接口,轉換成客戶期望的另外一個接口,讓原本接口不兼容的類可以合作無間。

現在我們有一個電視的類,新版電視的開關接口和老版電視的開關是不一樣的,客戶想要接著用老版電視的開關模式來操作新版電視,這時候就能用適配器模式來解決這個問題。

適配器模式可以分為對象適配器、類適配器和接口適配器三種,接下來先看看對象適配器,對象適配器是重新創建一個適配器類,實現了原先接口的方法,同時有一個新版電視對象,實現原先接口中的方法調用新版電視的方法。

技術分享圖片

我們設計一個NewTVAdapter的對象,實現TV接口,然後去調用NewTV的方法,具體代碼如下

技術分享圖片
public interface
TV { public void on(); public void off(); }
TV 技術分享圖片
public class OldTV implements TV {

    @Override
    public void on() {
        System.out.println("打開了老式電視!");
    }

    @Override
    public void off() {
        System.out.println("關閉了老式電視!");
    }
}
OldTV 技術分享圖片
public
class NewTV { public void onTV() { System.out.println("打開了新款電視!"); } public void offTV() { System.out.println("關閉了新款電視!"); } }
NewTV 技術分享圖片
public class NewTVAdapter implements TV {

    private NewTV newTV;

    public NewTVAdapter(NewTV newTV) {
        
this.newTV = newTV; } @Override public void on() { newTV.onTV(); } @Override public void off() { newTV.offTV(); } }
NewTVAdapter

測試代碼

public static void main(String[] args) {
        TV tv1 = new OldTV();
        tv1.on();
        tv1.off();

        NewTV newTV = new NewTV();
        tv1 = new NewTVAdapter(newTV);
        tv1.on();
        tv1.off();
    }

測試結果

技術分享圖片

還有一種類適配器,創建一個適配器類,繼承新版電視,同時實現老版開關的接口,接口方法裏調用父類的開關方法

技術分享圖片

其他代碼一樣,就是適配器代碼有所改變

技術分享圖片
public class NewTVAdapterClass extends NewTV implements TV {

    @Override
    public void on() {
        super.onTV();
    }

    @Override
    public void off() {
        super.offTV();
    }
}
NewTVAdapterClass

測試代碼

public static void main(String[] args) {
        TV tv1 = new OldTV();
        tv1.on();
        tv1.off();
        
        tv1 = new NewTVAdapterClass();
        tv1.on();
        tv1.off();
    }

測試結果

技術分享圖片

還有一種接口適配器,它只有某一個或者某幾個方法,對其他的方法並不關心。(當然作為一個電視,只有一個關閉功能顯然不合理,這裏只是做一個例子)

技術分享圖片

代碼如下

技術分享圖片
public abstract class NewTVAdapterAbstract implements TV {
    @Override
    public void on() {

    }

    @Override
    public void off() {

    }
}
NewTVAdapterAbstract 技術分享圖片
public class NewTV2 extends NewTVAdapterAbstract{
    @Override
    public void off() {
        System.out.println("新版的關閉方式!");
    }
}
NewTV2

測試代碼

public static void main(String[] args) {
        TV tv1 = new OldTV();
        tv1.on();
        tv1.off();

        tv1 = new NewTV2();
        tv1.on();
        tv1.off();
    }
}

測試結果

技術分享圖片

適配器模式將目標類和適配者類解耦,通過引入一個適配器類來重用現有的適配者類,無需修改原有結構,增加了類的透明性和復用性,擴展性很好。

設計模式(8)適配器模式