學點架構(gòu)設(shè)計——適配器模式

開篇小引

在上大學時我做了一個小項目是關(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)非常零亂犀变,不易整體進行把握妹孙。

Thanks To

設(shè)計模式學習筆記-適配器模式
《JAVA與模式》之適配器模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市获枝,隨后出現(xiàn)的幾起案子蠢正,更是在濱河造成了極大的恐慌,老刑警劉巖省店,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚣崭,死亡現(xiàn)場離奇詭異,居然都是意外死亡萨西,警方通過查閱死者的電腦和手機有鹿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谎脯,“玉大人葱跋,你說我怎么就攤上這事。” “怎么了娱俺?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵稍味,是天一觀的道長。 經(jīng)常有香客問我荠卷,道長模庐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任油宜,我火速辦了婚禮掂碱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘慎冤。我一直安慰自己疼燥,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布蚁堤。 她就那樣靜靜地躺著醉者,像睡著了一般。 火紅的嫁衣襯著肌膚如雪披诗。 梳的紋絲不亂的頭發(fā)上撬即,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音呈队,去河邊找鬼剥槐。 笑死,一個胖子當著我的面吹牛掂咒,可吹牛的內(nèi)容都是我干的才沧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绍刮,長吁一口氣:“原來是場噩夢啊……” “哼温圆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孩革,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤岁歉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后膝蜈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锅移,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年饱搏,在試婚紗的時候發(fā)現(xiàn)自己被綠了非剃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡推沸,死狀恐怖备绽,靈堂內(nèi)的尸體忽然破棺而出券坞,到底是詐尸還是另有隱情,我是刑警寧澤肺素,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布恨锚,位于F島的核電站,受9級特大地震影響倍靡,放射性物質(zhì)發(fā)生泄漏猴伶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一塌西、第九天 我趴在偏房一處隱蔽的房頂上張望他挎。 院中可真熱鬧,春花似錦雨让、人聲如沸雇盖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贸街,卻和暖如春庵寞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背薛匪。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工捐川, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逸尖。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓古沥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親娇跟。 傳聞我的和親對象是個殘疾皇子岩齿,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容