設(shè)計模式—適配器模式

本文博客同步發(fā)表在 http://hjxandhmr.github.io/2016/06/02/DesignPattern-Adapter/
今天我們來學(xué)習(xí)一種結(jié)構(gòu)型模式赫模,適配器模式(Adapter Pattern)问顷。

模式定義

將一個接口轉(zhuǎn)換成客戶希望的另一個接口疮跑,適配器模式使接口不兼容的那些類可以一起工作瞄勾,其別名為包裝器(Wrapper)稀余。適配器模式有兩種,一種是對象適配器勘伺,一種是類適配器怠褐。

模式結(jié)構(gòu)

適配器模式包含如下角色:

Target: 目標抽象類
Adapter: 適配器類
Adaptee: 適配者類
Client: 客戶類

UML圖

類適配器UML圖

對象適配器UML圖

類適配器模式代碼實現(xiàn)

Target.java

public interface Target {

    void sampleOperation1();

    void sampleOperation2();
}

Adaptee.java

public class Adaptee {

    public void sampleOperation1() {
        System.out.println("sampleOperation1");
    }
}

Adapter.java


public class Adapter extends Adaptee implements Target {

    @Override
    public void sampleOperation2() {
        System.out.println("sampleOperation2");
    }

}

測試類


public class MyClass {

    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        adapter.sampleOperation1();
        adapter.sampleOperation2();
    }
}

運行結(jié)果

對象適配器代碼實現(xiàn)

Target.java


public interface Target {

    void sampleOperation1();

    void sampleOperation2();
}

Adaptee.java

public class Adaptee {

    public void sampleOperation1() {
        System.out.println("sampleOperation1");
    }
}

Adapter.java


public class Adapter implements Target {

    private Adaptee mAdaptee;

    public Adapter(Adaptee adaptee) {
        mAdaptee = adaptee;
    }

    @Override
    public void sampleOperation1() {
        mAdaptee.sampleOperation1();
    }

    @Override
    public void sampleOperation2() {
        System.out.println("sampleOperation2");
    }

}

測試類


public class MyClass {

    public static void main(String[] args) {
        Adapter adapter =new Adapter(new Adaptee());
        adapter.sampleOperation1();
        adapter.sampleOperation2();
    }
}

運行結(jié)果

模式分析

  • 類適配器使用對象繼承的方式,是靜態(tài)的定義方式闸婴;而對象適配器使用對象組合的方式坏挠,是動態(tài)組合的方式。

  • 對于類適配器邪乍,由于適配器直接繼承了Adaptee降狠,使得適配器不能和Adaptee的子類一起工作,因為繼承是靜態(tài)的關(guān)系庇楞,當適配器繼承了Adaptee后榜配,就不可能再去處理 Adaptee的子類了。

  • 對于對象適配器吕晌,一個適配器可以把多種不同的源適配到同一個目標蛋褥。換言之,同一個適配器可以把源類和它的子類都適配到目標接口睛驳。因為對象適配器采用的是對象組合的關(guān)系烙心,只要對象類型正確,是不是子類都無所謂乏沸。

  • 對于類適配器淫茵,適配器可以重定義Adaptee的部分行為,相當于子類覆蓋父類的部分實現(xiàn)方法蹬跃。

  • 對于對象適配器匙瘪,要重定義Adaptee的行為比較困難,這種情況下蝶缀,需要定義Adaptee的子類來實現(xiàn)重定義丹喻,然后讓適配器組合子類。雖然重定義Adaptee的行為比較困難扼劈,但是想要增加一些新的行為則方便的很驻啤,而且新增加的行為可同時適用于所有的源。

  • 對于類適配器荐吵,僅僅引入了一個對象骑冗,并不需要額外的引用來間接得到Adaptee赊瞬。

  • 對于對象適配器,需要額外的引用來間接得到Adaptee贼涩。

  • 建議盡量使用對象適配器的實現(xiàn)方式巧涧,多用合成/聚合、少用繼承遥倦。當然谤绳,具體問題具體分析,根據(jù)需要來選用實現(xiàn)方式袒哥,最適合的才是最好的缩筛。

適配器模式的優(yōu)點

  • 將目標類和適配者類解耦,通過引入一個適配器類來重用現(xiàn)有的適配者類堡称,而無須修改原有代碼瞎抛。

  • 增加了類的透明性和復(fù)用性,將具體的實現(xiàn)封裝在適配者類中却紧,對于客戶端類來說是透明的桐臊,而且提高了適配者的復(fù)用性。

  • 靈活性和擴展性都非常好晓殊,通過使用配置文件断凶,可以很方便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類巫俺,完全符合“開閉原則”认烁。

類適配器模式還具有如下優(yōu)點:

  • 由于適配器類是適配者類的子類,因此可以在適配器類中置換一些適配者的方法识藤,使得適配器的靈活性更強砚著。

對象適配器模式還具有如下優(yōu)點:

  • 一個對象適配器可以把多個不同的適配者適配到同一個目標,也就是說痴昧,同一個適配器可以把適配者類和它的子類都適配到目標接口稽穆。

適配器模式的缺點

類適配器模式的缺點如下:

  • 對于Java、C#等不支持多重繼承的語言赶撰,一次最多只能適配一個適配者類舌镶,而且目標抽象類只能為抽象類,不能為具體類豪娜,其使用有一定的局限性餐胀,不能將一個適配者類和它的子類都適配到目標接口。

對象適配器模式的缺點如下:

  • 與類適配器模式相比瘤载,要想置換適配者類的方法就不容易否灾。如果一定要置換掉適配者類的一個或多個方法,就只好先做一個適配者類的子類鸣奔,將適配者類的方法置換掉墨技,然后再把適配者類的子類當做真正的適配者進行適配惩阶,實現(xiàn)過程較為復(fù)雜。

參考
http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/adapter.html
http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html

歡迎大家關(guān)注我的微信公眾號扣汪,我會不定期的分享些Android開發(fā)的技巧

[站外圖片上傳中……(5)]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末断楷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崭别,更是在濱河造成了極大的恐慌冬筒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茅主,死亡現(xiàn)場離奇詭異舞痰,居然都是意外死亡,警方通過查閱死者的電腦和手機暗膜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門匀奏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人学搜,你說我怎么就攤上這事÷垩埽” “怎么了瑞佩?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坯台。 經(jīng)常有香客問我炬丸,道長,這世上最難降的妖魔是什么蜒蕾? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任稠炬,我火速辦了婚禮,結(jié)果婚禮上咪啡,老公的妹妹穿的比我還像新娘首启。我一直安慰自己,他們只是感情好撤摸,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布毅桃。 她就那樣靜靜地躺著,像睡著了一般准夷。 火紅的嫁衣襯著肌膚如雪钥飞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天衫嵌,我揣著相機與錄音读宙,去河邊找鬼。 笑死楔绞,一個胖子當著我的面吹牛结闸,可吹牛的內(nèi)容都是我干的掖棉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼膀估,長吁一口氣:“原來是場噩夢啊……” “哼幔亥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起察纯,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤帕棉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后饼记,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體香伴,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年具则,在試婚紗的時候發(fā)現(xiàn)自己被綠了即纲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡博肋,死狀恐怖低斋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匪凡,我是刑警寧澤膊畴,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站病游,受9級特大地震影響唇跨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衬衬,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一买猖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滋尉,春花似錦玉控、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讽挟,卻和暖如春懒叛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耽梅。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工薛窥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓诅迷,卻偏偏與公主長得像佩番,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子罢杉,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

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