模式的定義
適配器模式把一個(gè)類(lèi)的接口變換成用戶(hù)所期待的另一種接口,從而使原本因接口不匹配而無(wú)法在一起工作的兩個(gè)類(lèi)能夠在一起工作。
使用場(chǎng)景
用電源接口做例子,筆記本電腦的電源一般都是接受5V的電壓,但是我們生活中的電線電壓一般都是220V的輸出。這個(gè)時(shí)候就出現(xiàn)了不匹配的狀況,在軟件開(kāi)發(fā)中我們稱(chēng)之為接口不兼容,此時(shí)就需要適配器來(lái)進(jìn)行一個(gè)接口轉(zhuǎn)換。在軟件開(kāi)發(fā)中有一句話(huà)正好體現(xiàn)了這點(diǎn):任何問(wèn)題都可以加一個(gè)中間層來(lái)解決。這個(gè)層我們可以理解為這里的Adapter層,通過(guò)這層來(lái)進(jìn)行一個(gè)接口轉(zhuǎn)換就達(dá)到了兼容的目的。
UML類(lèi)圖
適配器模式分兩種,即類(lèi)適配器模式、對(duì)象適配器模式
類(lèi)適配器模式
類(lèi)適配器模式把Adaptee的接口轉(zhuǎn)換成為T(mén)arget需要的接口。

在上圖中可以看出,Adaptee類(lèi)并沒(méi)有sampleOperation2()方法,而用戶(hù)則期待這個(gè)方法。為使客戶(hù)端能夠使用Adaptee類(lèi),提供一個(gè)中間環(huán)節(jié),即類(lèi)Adapter,把Adaptee的接口與Target類(lèi)的接口銜接起來(lái)。Adapter與Adaptee是繼承關(guān)系,這決定了這個(gè)是類(lèi)適配器模式.
模式中的角色
目標(biāo)(Target):客戶(hù)所期待的接口。
適配者(Adaptee):需要適配的類(lèi)。
適配器(Adapter):通過(guò)包裝一個(gè)適配者,把原接口轉(zhuǎn)換成目標(biāo)接口。
對(duì)象適配器模式
與類(lèi)適配器模式一樣,對(duì)象適配器模式把Adaptee的接口轉(zhuǎn)換成為T(mén)arget需要的接口,與類(lèi)適配器模式不同的是,對(duì)象適配器模式不是使用繼承實(shí)現(xiàn),而是把Adaptee委派到Adapter中實(shí)現(xiàn)的。

模式中的角色
目標(biāo)(Target):客戶(hù)所期待的接口。
適配者(Adaptee):需要適配的類(lèi)。
適配器(Adapter):通過(guò)包裝一個(gè)適配者,把原接口轉(zhuǎn)換成目標(biāo)接口。
類(lèi)適配器和對(duì)象適配器的權(quán)衡
類(lèi)適配器使用對(duì)象繼承的方式,是靜態(tài)的定義方式;而對(duì)象適配器使用對(duì)象組合的方式,是動(dòng)態(tài)組合的方式。
對(duì)于類(lèi)適配器,由于Adapter直接繼承了Adaptee,使得Adapter不能和Adaptee的子類(lèi)一起工作,因?yàn)槔^承是靜態(tài)的關(guān)系,當(dāng)Adapter繼承了Adaptee后,就不可能再去處理Adaptee的子類(lèi)了。
對(duì)于對(duì)象適配器,一個(gè)Adapter可以把多種不同的Adaptee適配到同一個(gè)目標(biāo)。換言之,同一個(gè)Adapter可以把Adaptee和它的子類(lèi)都適配到目標(biāo)接口。因?yàn)?strong>對(duì)象適配器采用的是對(duì)象組合的關(guān)系,只要對(duì)象類(lèi)型正確,是不是子類(lèi)都無(wú)所謂。
- 對(duì)于類(lèi)適配器,Adapter可以重定義Adaptee的部分行為,相當(dāng)于子類(lèi)覆蓋父類(lèi)的部分實(shí)現(xiàn)方法。
對(duì)于對(duì)象適配器,要重定義Adaptee的行為比較困難,這種情況下,需要定義Adaptee的子類(lèi)來(lái)實(shí)現(xiàn)重定義,然后讓Adapter組合子類(lèi)。雖然重定義Adaptee的行為比較困難,但是想要增加一些新的行為則方便的很,而且新增加的行為可同時(shí)適用于所有的Adaptee。
- 對(duì)于類(lèi)適配器,僅僅引入了一個(gè)對(duì)象,并不需要額外的引用來(lái)間接得到Adaptee。
對(duì)于對(duì)象適配器,需要額外的引用來(lái)間接得到Adaptee。
建議盡量使用對(duì)象適配器的實(shí)現(xiàn)方式,多用合成/聚合、少用繼承。當(dāng)然,具體問(wèn)題具體分析,根據(jù)需要來(lái)選用實(shí)現(xiàn)方式,最適合的才是最好的。
適配器模式的優(yōu)點(diǎn)
- 更好的復(fù)用性
系統(tǒng)需要使用現(xiàn)有的類(lèi),而此類(lèi)的接口不符合系統(tǒng)的需要。那么通過(guò)適配器模式就可以讓這些功能得到更好的復(fù)用。
- 更好的擴(kuò)展性
在實(shí)現(xiàn)適配器功能的時(shí)候,可以調(diào)用自己開(kāi)發(fā)的功能,從而自然地?cái)U(kuò)展系統(tǒng)的功能。
適配器模式的缺點(diǎn)
過(guò)多的使用適配器,會(huì)讓系統(tǒng)非常零亂,不易整體進(jìn)行把握。比如,明明看到調(diào)用的是A接口,其實(shí)內(nèi)部被適配成了B接口的實(shí)現(xiàn),一個(gè)系統(tǒng)如果太多出現(xiàn)這種情況,無(wú)異于一場(chǎng)災(zāi)難。因此如果不是很有必要,可以不使用適配器,而是直接對(duì)系統(tǒng)進(jìn)行重構(gòu)。