一、設計類圖
二、意圖
將一個類的接口轉換成客戶希望的另外一個接口。適配器模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
三、解決的問題
主要解決在軟件系統中,常常要將一些"現存的對象"放到新的環境中,而新環境要求的接口是現對象不能滿足的。
四、使用場景
- 系統需要使用現有的類,而此類的接口不符合系統的需要。
- 想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作,這些源類不一定有一致的接口。
- 通過接口轉換,將一個類插入另一個類系中。
五、核心代碼
適配器繼承或依賴已有的對象,實現想要的目標接口。
六、優點和缺點
優點:
- 可以讓任何兩個沒有關聯的類一起運行。
- 提高了類的複用。
- 增加了類的透明度。
- 靈活性好。
缺點:
- 過多地使用適配器,會讓系統非常零亂,不易整體進行把握。比如,明明看到調用的是 A 接口,其實內部被適配成了 B 接口的實現,一個系統如果太多出現這種情況,無異於一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統進行重構。
- 由於 JAVA 至多繼承一個類,所以至多隻能適配一個適配者類,而且目標類必須是抽象類。
七、代碼實現
/**
* 客戶端要進行調用的接口
* 目標接口
*
* @Author: [email protected]
* @Date: 2019-11-10 11:17
*/
public interface Target {
/**
* 客戶端需要請求的方法
*/
void request();
}
/**
* @Author: [email protected]
* @Date: 2019-11-10 11:22
* 需要被適配的接口 這個接口需要重新配置以適應目標接口
*/
public class Adaptee {
public void specificRequest() {
System.out.println("源接口對象調用源接口中的方法");
}
}
/**
* @Author: [email protected]
* @Date: 2019-11-10 11:23
* 適配器類
*/
public class Adapter implements Target {
/**
* 持有源接口對象
*/
private Adaptee adaptee;
/**
* 構造方法,傳入需要被適配的對象
*
* @param adaptee
*/
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
System.out.println("適配器包裝源接口對象,調用源接口的方法");
adaptee.specificRequest();
}
}
public class Main {
public static void main(String[] args) {
//創建源對象(需要被適配的對象)
Adaptee adaptee = new Adaptee();
//利用源對象對象一個適配器對象,提供客戶端調用的方法
Adapter adapter = new Adapter(adaptee);
System.out.println("Client調用適配器中的方法");
adapter.request();
}
}