1. 程式人生 > >設計模式學習心得<適配器 Adapter>

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

有關 系統 linu 修改 由於 enume class 轉換 適配器模式

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

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

概述


  • 意圖
    將一個類的接口轉換成客戶希望的另外一個接口。
    適配器模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。

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

  • 何時使用
  1. 系統需要使用現有的類,而此類的接口不符合系統的需要。
  2. 想要建立一個可以重復使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作,這些源類不一定有一致的接口。
  3. 通過接口轉換,將一個類插入另一個類系中。
    (比如老虎和飛禽,現在多了一個飛虎,在不增加實體的需求下,增加一個適配器,在裏面包容一個虎對象,實現飛的接口。)
  • 如何解決
    繼承或依賴(推薦)。

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

  • 應用實例
  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 至多繼承一個類,所以至多只能適配一個適配者類,而且目標類必須是抽象類。
  • 使用場景
    有動機地修改一個正常運行的系統的接口,這時應該考慮使用適配器模式。

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

實現


  • 適配器模式有如下三個角色
    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();
 }

}
```

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