博客 / 詳情

返回

適配器模式

目錄

  • 類適配器
  • 對象適配器
  • 兩種適配器的選擇
  • 使用場景

類適配器

下面我們使用Mac電腦和U盤適配的一個簡單實例來了解類適配器的實現方式。

首先創建一個Mac的接口有讀寫的數據的功能

public interface MacInterface {
    void write(String msg);
    String read();
}

然後有一個u盤的實例

public class UDisk {
    public void byWrite(String msg){
        System.out.println(msg);
    }
    public String byRead(){
        return "拜登家譜";
    }
}

但是mac接口直接連接u盤所以我們給它增加一個適配器,通過適配器連接兩者。

public class MacUsbAdaptor extends UDisk implements MacInterface{
    @Override
    public void write(String msg) {
        super.byWrite(msg);
    }

    @Override
    public String read() {
        return super.byRead();
    }
}
public class AdaptorTest {
    @Test
    public void test(){
        MacInterface macInterface = new MacUsbAdaptor();
        System.out.println(macInterface.read());
        macInterface.write("川普私密照片");
    }
}
=====結果=====
拜登家譜
川普私密照片

對象適配器

使用和上面相同的實例,通過組合的方式來實現對象適配器。

public interface MacInterface {
    void write(String msg);
    String read();
}
public class UDisk {
    public void byWrite(String msg){
        System.out.println(msg);
    }
    public String byRead(){
        return "拜登家譜";
    }
}
public class MacUsbAdaptor implements MacInterface {
    private UDisk disk;

    public MacUsbAdaptor(UDisk disk) {
        this.disk = disk;
    }

    @Override
    public void write(String msg) {
        //適配過程中肯定涉及到一些 “適配” 的過程,比如説統一格式
        disk.byWrite(msg);
    }

    @Override
    public String read() {
        return disk.byRead();
    }
}
public class AdaptorTest {
    @Test
    public void test(){
        MacInterface macInterface = new MacUsbAdaptor(new UDisk());
        System.out.println(macInterface.read());
        macInterface.write("川普私密照片");
    }
}
=====結果=====
拜登家譜
川普私密照片

兩種適配器的選擇

  • 被適配的類(如UDisk)的接口(類裏面的方法)不多,兩者都可以
  • 被適配的類的接口較多而且接口大多數都需要和接口類(如 MacInterface)中的方法適配,那麼可以選擇類適配器,這樣可以複用被適配類中的方法,節省代碼量。
  • 被適配的類的接口較多而且其接口和接口類(如 MacInterface)中的方法適配的不多,那麼可以選擇對象適配器,組合相對於繼承更加靈活。

使用場景

  • 原有接口無法修改但又必須快速兼容新接口
  • 不同數據格式、協議之間的轉換
  • 需要使用外部組件組合成新組件來提供功能,而又不想重複開發部分功能
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.