定義
適配器模式把一個類的接口變換成客戶端所期待的另外一種接口,從而使原本因為接口不匹配而無法一起工作的倆個類能夠在一起工作。
使用場景
- 系統需要使用現有的類,而此類的接口不符合系統的需要,即接口不兼容。
- 想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。
- 需要一個統一的輸出接口,而輸入端的類型不可預知。
UML圖
適配器模式.png
解釋
優點
- 更好的復用性
系統需要使用現有的類,而此類的接口不符合系統的需要。那么通過適配器模式可以讓這些功能得到更好的復用 - 更好的擴展性
在實現適配器功能的時候,可以調用自己開發的功能。從而自然的擴展系統的功能
缺點
- 過多的使用適配器,會讓系統非常凌亂,不易整體把握。例如,明明看到調用的是A接口,其實內部被適配成了B接口的實現,一個系統如果太多出現這種情況,無異于一場災難。因此,如果不是很有必要,可以使用適配器,而是對系統進行重構。
例子
將220V交流電轉換為5V的直流電壓,
- 被轉換的原始對象
/** Adaptee角色,需要被裝換的對象
* Created by Niwa on 2017/8/2.
*/
public class Volt220 {
public int getVolt220(){
return 220;
}
}
- 需要轉換成的目標角色,5V直流
/** Target角色
* Created by Niwa on 2017/8/2.
*/
public interface FiveVolt {
int getVolt5();
}
- 適配器
/** Adapter角色,將220v的電壓裝換成5v的電壓
* Created by Niwa on 2017/8/2.
*/
public class VoltAdapter extends Volt220 implements FiveVolt{
@Override
public int getVolt5() {
return 5;
}
}
關鍵點在這里,通過實現要轉換成的目標接口,和繼承原始類實現接口轉換
- 測試類
/** 測試類
* Created by Niwa on 2017/8/2.
*/
public class Client {
public static void main(String[] args){
VoltAdapter voltAdapter = new VoltAdapter();
System.out.println("輸出電壓:" + voltAdapter.getVolt5());
}
}
輸出結果:
輸出電壓:5
源代碼:DesignPattern
參考:
《Android源碼設計模式解析與實戰讀書》
各大佬博客
end