適配器模式:
將一個類的接口,轉換成客戶期望的另一個接口,適配器讓原本接口不兼容的類可以合作無間。
官方定義不太好理解,我翻譯一下,在適配器模式中,可以通過創建適配器進行接口轉換,讓不兼容的接口變成兼容。
比如中國人家庭裏面都用的國標的充電器,那插座肯定也是國標的,不然沒有辦法充電,但是當你買了一個港行的ipad的時候,他的充電器卻是港版插頭,爲了能夠正常充電,我們就需要買一個適配器(adapter),讓港版插頭也能夠用在國標的插座上,對於用戶來講,他就把港版插頭當做國標的插頭來用。
如下圖:
採用適配器模式的UML圖:
通過UML圖可以看到,適配器模式主要關聯三個角色:
Target(目標接口):用戶目標接口,即用戶需要執行的動作。
Adapter(適配器類):通過實現目標接口,並持有被適配者的引用,把用戶對目標接口的動作,委託給被適配者執行。
Adaptee(被適配者接口):這個接口需要適配。
目標接口:
/**
* @Author: 歡迎關注公衆號:程序員小安
* @description: 國標充電器標準
* @CreateDate: 2019/11/20
* @Version: 1.0
*/
public interface ChinaPlugTarget {
/**
* 通過中國標準供電
*/
void powerWithChinastandard();
}
目標對象
/**
* @Author: 歡迎關注公衆號:程序員小安
* @description:國標充電頭
* @CreateDate: 2019/11/20
* @Version: 1.0
*/
public class ChinaPlug implements ChinaPlugTarget {
@Override
public void powerWithChinastandard() {
System.out.println("使用國標充電頭供電");
}
}
被適配接口
/**
* @Author: 歡迎關注公衆號:程序員小安
* @description: 港行充電器標準
* @CreateDate: 2019/11/20
* @Version: 1.0
*/
public interface HongkongPlugAdaptee {
/**
* 通過香港標準供電
*/
void powerWithHongkongstandard();
}
被適配者
/**
* @Author: 歡迎關注公衆號:程序員小安
* @description:港行充電頭
* @CreateDate: 2019/11/20
* @Version: 1.0
*/
public class HongkongPlug implements HongkongPlugAdaptee {
@Override
public void powerWithHongkongstandard() {
System.out.println("使用港行充電頭供電");
}
}
適配器
/**
* @Author: 歡迎關注公衆號:程序員小安
* @description:適配器
* @CreateDate: 2019/11/20
* @Version: 1.0
*/
public class ChinaPlugAdapter implements ChinaPlugTarget {
private HongkongPlugAdaptee hongkongPlugTarget;
public ChinaPlugAdapter(HongkongPlugAdaptee hongkongPlugTarget) {
this.hongkongPlugTarget = hongkongPlugTarget;
}
@Override
public void powerWithChinastandard() {
hongkongPlugTarget.powerWithHongkongstandard();
}
}
用戶
public class User {
public static void main(String[] args){
ChinaPlug chinaPlug = new ChinaPlug();
chinaPlug.powerWithChinastandard();
HongkongPlug hongkongPlug = new HongkongPlug();
ChinaPlugTarget chinaPlugAdaptee = new ChinaPlugAdapter(hongkongPlug);
chinaPlugAdaptee.powerWithChinastandard();
}
}
運行結果:
使用國標充電頭供電
使用港行充電頭供電
使用適配器的過程如下:
1.用戶通過目標接口調用適配器的方法對適配器發出請求。
2.適配器使用被適配器接口把請求轉換成被適配者的一個或多個調用接口。
3.客戶接收到調用的結果,但並未察覺這一切是適配器在起轉換作用。
採用適配器模式後,對於用戶來說,他完全感知不到他在使用港行插頭,用戶可以很簡單的把港版插頭當做國標的插頭來用。國標充電器標準接口是目標接口,港行充電頭是被適配者,適配器實現目標接口,並且持有被適配器的引用,當用戶調用適配器的目標方法時,其實是委託給被被適配器去執行。
類適配器
Adapter 類繼承Adaptee (被適配類),同時實現Target 接口(因爲 Java 不支持多繼承,所以只能通過接口的方法來實現多繼承)
對象適配器
Adapter類實現Target 接口,並持有Adaptee的引用,利用組合的方式將請求傳遞給被適配者。
適配器模式的優點
(1)通過創建適配器進行接口轉換,讓不兼容的接口變成兼容,這可以讓目標類和適配者類解耦。
(2)靈活性和擴展性都非常好,符合開閉原則,我們想要改變接口時,適配器可以將改變的部分封裝起來,用戶不必爲了應對不同的接口而每次跟着修改。
(3)使用對象組合,由於適配器持有被適配者的接口,而不是具體實例,也就是,被適配者的任何子類,都可以搭配着該適配器使用。
什麼時候使用:
1 系統需要使用現有的類,而這些類的接口不符合系統的需要。
2 想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。
3 需要一個統一的輸出接口,而輸入端的類型不可預知。
如有錯誤歡迎指出來,一起學習。