個人博客CoorChice,https://chenbingx.github.io/ ,最新文章將會首發(fā)CoorChice的博客,歡迎探索哦 !
同時,搜索微信公眾號CoorChice,或掃描文章末尾二維碼,可以關(guān)注我的微信公眾號。同期文章也將會優(yōu)先推送到微信公眾號中,以提醒您有新鮮文章出爐。

定義及實質(zhì)
定義
將一個類的接口轉(zhuǎn)換為客戶希望的另一個接口,適配器模式使原本由于接口不兼容不能一起工作的類,可以在一起工作。實質(zhì)
類型轉(zhuǎn)換,功能復(fù)用。
比較抽象,往下繼續(xù)看看。
模式圖解
對象適配器
解釋:
現(xiàn)在有一個單手劍(現(xiàn)有接口),但英雄只能裝備法杖(目標(biāo)接口)。所以需要定義一個單手劍轉(zhuǎn)換器(適配器),把法杖插進(jìn)去,它屬于單手劍系列,但內(nèi)部其實是一根法杖(持有現(xiàn)有接口)!當(dāng)英雄使用單手劍轉(zhuǎn)化器時,實際使用的是法杖。
對象適配器模式UML圖

從上圖可以看出:
- Target接口為Client客戶端所要求的接口;
- Adapter是適配器,實現(xiàn)了Target接口,持有Adaptee(原始類型,通常它與Client不兼容,但Client又想要使用它的功能),并且將它適配成了Client要求的Target類型。
來看看原始類型Adaptee
public class Adaptee{
public void specificRequest(){
//do something...
}
}
Target接口及Adapter接口
public interface Target{
void request();
}
public class Adapter implements Target{
private Adaptee daptee;
public Adapter{
daptee = new Adaptee();
}
public void request(){
adaptee.sepcificRequest();
}
}
Client如何使用
public class Client{
private Target target;
public static void main(String[] args){
target = new Adapter(); //創(chuàng)建適配器,但功能仍然是Adaptee的
target.request(); //實際調(diào)用的是Adapter的specificRequest()方法
}
}
對象適配器模式順序圖

結(jié)合上面代碼看。
類適配器模式
還是上面那個例子,但這次不需要單手劍轉(zhuǎn)換器了,而是直接創(chuàng)建一種即是單手劍,又是法杖的武器(采用多重繼承,但是Java世界不支持!)。在Java宇宙中,只能通過繼承單手劍,Copy法杖功能來實現(xiàn)。
類適配器模式UML圖

- 從圖中可以看到,類適配器模式使用了多重繼承的特性,但是Java只支持單繼承,所以這種模式在Java中不是太適用;
- Adapter適配器同時繼承了Client所期望的類型Target類,和想要使用的功能類Adaptee類。
- 客戶端只需要調(diào)用Adapter繼承到的specificRequest()方法即可。
這個模式在Java中不常用,而且順序圖比較簡單,就不展示了。
拓展——接口適配器
嚴(yán)格來說接口適配器并不是標(biāo)準(zhǔn)的適配器模式,它只是借用了適配器的概念而已。接下來看看它是怎么一回事。
場景:
我們可能遇到過這樣一種場景,就是一個interface的方法很多,而我們只想使用其中少數(shù)幾個,并不想直接實現(xiàn)它,然后把所有方法都重寫一遍。
解決方法:
創(chuàng)建一個abstract抽象類,實現(xiàn)目標(biāo)接口interface,然后我們就可以繼承這個抽象類,選擇其中想要的方法去實現(xiàn)邏輯,而不用把所有方法都列出來。
接口適配器模式UML圖

如圖,AbstractAdapter實現(xiàn)了Api,然后Adapter繼承AbstractAdapter就可以選擇想要的方法重寫就好,而不用把所有方法都列出來。
它最大的作用其實在寫內(nèi)部類的時候,有的接口要求重寫的方法很多,這樣會多出很多行無用的代碼,這個時候就可以定義一個接口適配器,選擇性的列出并重寫方法就好。
模式優(yōu)缺點
優(yōu)勢
- 轉(zhuǎn)換接口,提高復(fù)用性;
- 具有更好的擴展性。我們可以在適配器中擴展新功能,同時還能兼顧老功能。
缺點
- 使用不合理容易造成迷惑。當(dāng)我們調(diào)用A對象的功能時,其內(nèi)部其實是調(diào)用了B的功能,讓人不易理解。
