開篇小引
在上大學時我做了一個小項目是關(guān)于人機交互的應(yīng)用,我負責實現(xiàn)的部分是通過語音識別技術(shù)接收用戶的問題苞慢,然后在數(shù)據(jù)庫中檢索預(yù)置的問題答案凤类,并由我們的應(yīng)用“說”出來對用戶的問題進行解答芒涡。當時我就由這個應(yīng)用的交互模式產(chǎn)生了一個小小的想法吁峻,我希望有一天可以實現(xiàn)一個很簡單方便的東西能讓中國的老奶奶和美國甚至更多其他國家的老奶奶坐在一起輕松愉快地聊天,完全不用擔心各自語言的障礙捞魁,這涉及到語音識別和機器翻譯等諸多技術(shù)至会,現(xiàn)在頂級的科技公司已經(jīng)在各種細分的技術(shù)上有研究實踐了。我的那個小想法其實與本篇博客的主題——適配器模式——有相似的實現(xiàn)思想谱俭。
定義及特點
適配器模式將一個類的接口轉(zhuǎn)換成客戶期望的另一個接口奉件,使得原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
適配器模式可以通過創(chuàng)建適配器進行接口轉(zhuǎn)換昆著,讓不兼容的接口變得能兼容县貌。這可以讓客戶從實現(xiàn)的接口解耦,如果在一段時間之后凑懂,我們想要改變接口煤痕,適配器可以將改變的部分封裝起來,客戶端就不必為了應(yīng)對不同的接口而每次跟著修改征候。
適配器模式涉及到三種角色:
● 目標接口(Target)——定義客戶期望的與特定領(lǐng)域相關(guān)的接口
● 適配者類(Adaptee)——定義一個已經(jīng)存在的接口杭攻,是需要適配的類
● 適配器類(Adapter)——通過包裝一個需要適配的對象,把原接口轉(zhuǎn)換成目標接口
適用場景
以下情況可使用適配器模式:
√ 系統(tǒng)需要使用現(xiàn)有的類疤坝,而這些類的接口不符合系統(tǒng)的接口
√ 想要建立一個可以重用的類兆解,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來引進的類一起工作
√ 兩個類所做的事情相同或相似跑揉,但是具有不同接口的時候
√ 舊的系統(tǒng)開發(fā)的類已經(jīng)實現(xiàn)了一些功能锅睛,但是客戶端卻只能以另外接口的形式訪問,但我們不希望手動更改原有類的時候
√ 使用第三方組件历谍,組件接口定義和自己定義的不同现拒,不希望修改自己的接口,但是要使用第三方組件接口的功能
實現(xiàn)方式
在GoF的設(shè)計模式中望侈,適配器模式有兩種可行的實現(xiàn)方式:類適配器和對象適配器印蔬,類適配器使用多重繼承對一個接口與另一個接口進行匹配,如下圖所示
對象適配器依賴于對象組合脱衙,如下圖所示
類適配器因為需要Adapter類同時繼承自Target類和Adaptee類侥猬,所以只能在支持多重繼承的語言中實現(xiàn)(Java雖然不支持多繼承,但可以通過實現(xiàn)接口implements interface來實現(xiàn)類適配器捐韩,如下代碼示例)退唠;對象適配器模式充滿著良好的OO設(shè)計原則:使用對象組合,以修改的接口包裝被適配者荤胁,這樣被適配者的任何子類尤溜,都可以搭配著適配器使用后众。
public interface Target {
/**
* 這是適配者類Adaptee也有的方法
*/
public void sampleOperation1();
/**
* 這是適配者類Adapteee沒有的方法
*/
public void sampleOperation2();
}
public class Adaptee {
void sampleOperation1(){}
}
public class Adapter extends Adaptee implements Target {
/**
* 由于適配者類Adaptee沒有方法sampleOperation2()
* 因此適配器類Adapter補充上這個方法
*/
@Override
public void sampleOperation2() {
//實現(xiàn)相關(guān)的代碼
}
}
類適配器和對象適配器有不同的權(quán)衡噪舀。
類適配器:
● 用一個具體的Adapter類對Adaptee和Target進行匹配,這使得Adapter不能和Adaptee的子類一起工作
● 使得Adapter可以重定義Adaptee的部分行為盆驹,因為Adapter是Adaptee的子類
● 僅僅引入了一個對象,并不需要額外的指針以間接得到Adaptee
對象適配器:
● 允許一個Adapter與多個Adaptee(即Adaptee本身以及它的所有子類)同時工作秸苗,Adapter也可以一次給所有的Adaptee添加功能
● 重定義Adaptee的行為比較困難(這需要生成Adaptee的子類并且使得Adapter引用這個子類而不是引用Adaptee本身)
適配器小結(jié)
使用適配器的優(yōu)點:
1召娜、通過適配器运褪,客戶端可以調(diào)用同一接口惊楼,因而對客戶端來說是透明的。這樣做更簡單秸讹、更直接檀咙、更緊湊。
2璃诀、復(fù)用了現(xiàn)存的類弧可,解決了現(xiàn)存類和復(fù)用環(huán)境要求不一致的問題。
3劣欢、將目標類和適配者類解耦棕诵,通過引入一個適配器類重用現(xiàn)有的適配者類,而無需修改原有代碼凿将。
4校套、一個對象適配器可以把多個不同的適配者類適配到同一個目標,也就是說牧抵,同一個適配器可以把適配者類和它的子類都適配到目標接口笛匙。
使用適配器的缺點:
過多的使用適配器,會讓系統(tǒng)非常零亂犀变,不易整體進行把握妹孙。