設計模式學習心得<適配器 Adapter>

適配器模式(Adapter Pattern)是做爲兩個不兼容的接口之間的橋樑。這種類型的設計模式屬於結構型模式,它結合了兩個獨立接口的功能。java

這種模式涉及到一個單一的類,該類負責加入獨立的或不兼容的接口功能。設計模式

概述


  • 意圖
    將一個類的接口轉換成客戶但願的另一個接口。
    適配器模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。this

  • 主要解決
    主要解決在軟件系統中,經常要將一些"現存的對象"放到新的環境中,而新環境要求的接口是現對象不能知足的。設計

  • 什麼時候使用
  1. 系統須要使用現有的類,而此類的接口不符合系統的須要。
  2. 想要創建一個能夠重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在未來引進的類一塊兒工做,這些源類不必定有一致的接口。
  3. 經過接口轉換,將一個類插入另外一個類系中。
    (好比老虎和飛禽,如今多了一個飛虎,在不增長實體的需求下,增長一個適配器,在裏面包容一個虎對象,實現飛的接口。)
  • 如何解決
    繼承或依賴(推薦)。code

  • 關鍵代碼
    適配器繼承或依賴已有的對象,實現想要的目標接口。對象

  • 應用實例
  1. 美國電器 110V,中國 220V,就要有一個適配器將 110V 轉化爲 220V。
  2. JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,則要將之前系統的 Enumeration 接口轉化爲 Iterator 接口,這時就須要適配器模式。
  3. 在 LINUX 上運行 WINDOWS 程序。
  4. JAVA 中的 jdbc。
  • 優勢
  1. 可讓任何兩個沒有關聯的類一塊兒運行。
  2. 提升了類的複用。
  3. 增長了類的透明度。
  4. 靈活性好。
  • 缺點
  1. 過多地使用適配器,會讓系統很是零亂,不易總體進行把握。
    好比,明明看到調用的是 A 接口,其實內部被適配成了 B 接口的實現,一個系統若是太多出現這種狀況,無異於一場災難。所以若是不是頗有必要,能夠不使用適配器,而是直接對系統進行重構。
  2. 因爲 JAVA 至多繼承一個類,因此至多隻能適配一個適配者類,並且目標類必須是抽象類。
  • 使用場景
    有動機地修改一個正常運行的系統的接口,這時應該考慮使用適配器模式。blog

  • 注意事項
    適配器不是在詳細設計時添加的,而是解決正在服役的項目的問題。繼承

實現


  • 適配器模式有以下三個角色
    Target:目標抽象類
    Adapter:適配器類
    Adaptee:適配者類

  • step 1
    須要一個Adaptee接口:Robot.java。提供cry()run()方法。
public interface Robot {
     void cry();

     void move();
 }
  • step 2
    實現Adaptee接口:BioRobot.java。它能夠叫和慢慢跑
public class BioRobot implements Robot{

     public void cry() {
         System.out.println("仿生機器人叫.....");
     }

     public void move() {
         System.out.println("仿生機器人慢慢移動....");
     }

 }
  • step 3
    須要Target類:Dog.java。它能夠汪和快跑
public class Dog {
     public void wang(){
         System.out.println("小狗叫:汪汪.....");
     }

     public void run(){
         System.out.println("小狗快快跑......");
     }
 }
  • step 4
    輪到重點啦:適配器Adapter,這個適配器可以使仿生機器人像狗同樣叫,同樣跑。
public class DogAdapter implements Robot{
     Dog dog;
     public DogAdapter(Dog dog){     //取得要適配的對象的引用
         this.dog = dog;
     }

     /**
      * 實現接口中的方法,只須要在相應的方法間進行轉換便可完成。
      */
     public void cry() {
         System.out.println("機器人模擬狗叫...");
         dog.wang();
     }

     public void move() {
         System.out.println("機器人模擬狗跑...");
         dog.run();
     }

     public static void main(String[] args) {
         BioRobot robot = new BioRobot();        //首先咱們須要一個機器人
         Dog dog = new Dog();         //和一隻狗
 
         //將這隻狗包裝到機器人中,使其有點兒像機器人
         Robot dogRobot = new DogAdapter(dog);

         //而後是機器人叫和跑
         System.out.println("BioRob cry.....");
         dogRobot.cry();
         dogRobot.move();
     }
 }

運行結果:接口

BioRob cry......
機器人模擬狗叫...
小狗叫:汪汪......
機器人模擬狗跑...
小狗快快跑......
相關文章
相關標籤/搜索