適配器模式的理解和示例

  • 2019 年 10 月 3 日
  • 筆記

一、是什麼

1. 定義:讓原來不兼容的兩個介面協同工作

2. 分類: 類適配器、對象適配器、介面適配器

3. 角色

  • 目標介面:Target,該角色把其他類轉換為我們期望的介面
  • 被適配者: Adaptee 原有的介面,也是希望被改變的介面
  • 適配器: Adapter, 將被適配者和目標介面組合到一起的類

4. 類圖

對象適配器,使用組合

類適配器,在java中實現不了,需要多重繼承才能實現,類圖是這個樣子的,當然如果變通一下,Target是介面就可以了

介面適配器 抽象方法

介面適配器的使用場景: 原有介面有很多方法,而我們只需要其中一部分,這是看可以用抽象類來實現該介面,不需要的方法只需要寫個空方法(默認實現)就好了,介面目標類去實現自己需要的介面

適用的場景是不想實現原有類的所有方法

二、示例

  • 背景:買了一個進口筆記型電腦電腦
  • 衝突:筆記型電腦電腦需要的三項電源,和只提供的二項電源衝突
  • 解決方案:設置一個適配器二項充電口轉化為三項充電口

2.1.1 Adaptee 原有的類 提供二項電

/**   * 插頭 二項供電 Adaptee   */  public class TwoPower {        public void powerByTwo() {          System.out.println("提供二項供電");      }  }

 2.1.2 Target 目標類  能輸出三項供電

/**   * 插頭提供三項供電 (target)   */  public interface ThreePower {        /**       * 三項供電       */      void powerByThree();  }

2.1.3 對象適配器,轉換類 Adapter

/**   * 二項轉三項的適配器  組合的方式  對象適配器   */  public class TwoToThreeAdapter implements ThreePower{        /**       * 使用委託來完成適配       */      private TwoPower twoPower;        public TwoToThreeAdapter(TwoPower twoPower) {          this.twoPower = twoPower;      }          @Override      public void powerByThree() {          System.out.println("藉助組合適配器轉化二項電");          twoPower.powerByTwo();      }  }

2.1.4 類適配器 轉換類 Adapter

/**   *  二項轉三項的適配器  繼承的方式  類   */  public class TwoToThreeAdapter2 extends TwoPower implements ThreePower {          @Override      public void powerByThree() {          System.out.println("藉助繼承適配器轉化二項電");          this.powerByTwo();      }  }

測試

/**   * 筆記型電腦電腦 這是使用組合模式的-適配器模式   */  public class NoteBook {        /**       * 期望的三項供電介面       */      private ThreePower threePower;        public NoteBook(ThreePower threePower) {          this.threePower = threePower;      }          public static void main(String[] args) {          // ============================ 繼承方式的適配器使用 類適配器 =====================================          ThreePower threePower1 = new TwoToThreeAdapter2();          NoteBook noteBook1 = new NoteBook(threePower1);          noteBook1.recharge();          noteBook1.work();            // ============================ 組合方式的適配器使用 對象適配器 =====================================          // 現在只有二項供電          TwoPower twoPower = new TwoPower();          ThreePower threePower = new TwoToThreeAdapter(twoPower);          NoteBook noteBook = new NoteBook(threePower);          // 1. 充電          noteBook.recharge();          // 2. 工作          noteBook.work();      }        public void work() {          System.out.println("筆記型電腦電腦開始工作!");      }        public void recharge() {          // 使用三項充電          threePower.powerByThree();      }  }

控制台顯示:

  提供二項供電
  藉助繼承適配器轉化二項電
  筆記型電腦電腦開始工作!

  提供二項供電
  藉助組合適配器轉化二項電
  筆記型電腦電腦開始工作!

三、總結

適配器好處

  • 重用
    • 復用的現存的類, 解決了現存類和復用環境要不一致的問題
  • 低耦合
    • 無需修改原有程式碼(遵循開閉原則)

這裡說些缺點吧,過多的使用適配器,的確會讓程式看起來很難懂,我的理解是,在適配別人介面和其他API介面時,適配器的用處就來了