設(shè)計(jì)模式[6]-適配器模式-Adapter Pattern

1. 適配器模式

適配器模式(Adapter Pattern)是結(jié)構(gòu)性設(shè)計(jì)模式瞬矩,其目的是協(xié)調(diào)不兼容的結(jié)構(gòu),把一個(gè)類(lèi)的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無(wú)法在一起工作的兩個(gè)類(lèi)能夠在一起工作。

適配器模式包括了類(lèi)的適配器模式和對(duì)象的適配器模式相速,尤其是對(duì)象的適配器模式,它是其它結(jié)構(gòu)性設(shè)計(jì)模式的起源鲜锚。結(jié)構(gòu)性設(shè)計(jì)模式一共7種突诬,分別是適配器模式、裝飾器模式芜繁、代理模式旺隙、外觀模式、橋接模式骏令、組合模式蔬捷、享元模式。

適配器模式的角色一共有三種榔袋。

  • Target(目標(biāo)類(lèi)): 客戶端需要的接口周拐,可以是一個(gè)抽象類(lèi)或接口,也可以是具體類(lèi)凰兑。

  • Adaptee(適配者類(lèi)): 被適配的角色妥粟,由于不是客戶端期待的接口,需要被適配吏够。

  • Adapter(適配器類(lèi)): 適配器把源接口轉(zhuǎn)換成目標(biāo)接口勾给,對(duì)Target和Adaptee進(jìn)行適配,是適配器模式的核心锅知。

2. 構(gòu)建者模式舉例

2.1 類(lèi)的適配器模式

類(lèi)適配器模式中適配器和適配者是繼承關(guān)系播急。

當(dāng)希望將一個(gè)類(lèi)轉(zhuǎn)換成滿足另一個(gè)新接口的類(lèi)時(shí),可以使用類(lèi)的適配器模式喉镰,創(chuàng)建一個(gè)新類(lèi)旅择,繼承原有的類(lèi)惭笑,實(shí)現(xiàn)新的接口即可侣姆。

類(lèi)的適配器模式中,只能適配一種適配者(Adaptee)沉噩,因?yàn)橹荒躩ava只允許繼承一個(gè)類(lèi)捺宗。

Paste_Image.png
序號(hào) 類(lèi)名 角色 說(shuō)明
1 Target Target 目標(biāo)類(lèi)
2 Adaptee Adaptee 適配者類(lèi),被適配的角色
3 Adapter Adapter 適配器類(lèi)
4 Client 客戶端 演示調(diào)用

1. Target 目標(biāo)類(lèi)

/**
 * 目標(biāo)類(lèi)川蒙,定義客戶需要的接口蚜厉。
 */
public interface Target {
    // 連接USB接口
    public void ConnectUsb();
    // 給手機(jī)充電
    public void chargePhone();
}

2. Adaptee 適配者類(lèi),源類(lèi)

/**
 * 適配者類(lèi)畜眨,被適配的角色昼牛。
 */
public class Adaptee {

    public void charge(){
        System.out.println("接通 220V 電源");
    }
}

3. Adapter 適配器

/**
 * 適配器類(lèi)术瓮,是適配器模式的核心,對(duì)Adaptee和Target進(jìn)行適配贰健。
 * <p>
 * 類(lèi)的適配器模式中胞四,只能適配一種適配者(Adaptee),因?yàn)橹荒躩ava只允許繼承一個(gè)類(lèi)伶椿。
 */
public class Adapter extends Adaptee implements Target {

    @Override
    public void ConnectUsb() {
        System.out.println("連接USB");
    }

    // 把220V的電源適配成5V的辜伟。
    @Override
    public void chargePhone() {
        charge();
        System.out.println("接通 5V 的電源");
    }
}

4. Client 客戶端

/**
 * 客戶端需要的是5V的電源,Adaptee提供的是220V的電源脊另,因此需要適配导狡。
 */
public class Client {

    public static void main(String[] args) {
        Target target = new Adapter();
        target.ConnectUsb(); // 連接USB
        target.chargePhone(); // 充電
    }
}

2.2 對(duì)象的適配器模式

對(duì)象的適配器模式,和上面的類(lèi)的適配器模式的不同點(diǎn)在于適配器類(lèi)偎痛,對(duì)象適配器模式中適配器和適配者之間是關(guān)聯(lián)關(guān)系旱捧。

當(dāng)希望將一個(gè)對(duì)象轉(zhuǎn)換成滿足另一個(gè)新接口的對(duì)象時(shí),可以創(chuàng)建一個(gè)Adapter(或者叫Wrapper)類(lèi)看彼,持有原類(lèi)的一個(gè)實(shí)例廊佩,在Adapter類(lèi)的方法中,調(diào)用實(shí)例的方法靖榕。

Paste_Image.png
/**
 * 適配器類(lèi)标锄,是適配器模式的核心,對(duì)Adaptee和Target進(jìn)行適配茁计。
 * <p>
 * 本例是對(duì)象的適配器模式料皇,即Adapter持有Adaptee實(shí)例,而不是繼承星压。
 * 這樣依賴適配器就可以適配更多的Adaptee践剂。
 */
public class Adapter implements Target {

    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void ConnectUsb() {
        System.out.println("連接USB");
    }

    // 把220V的電源適配成5V的。
    @Override
    public void chargePhone() {
        adaptee.charge();
        System.out.println("接通 5V 的電源");
    }
}

3. 適配器模式總結(jié)

適配器模式是結(jié)構(gòu)性設(shè)計(jì)模式娜膘,通過(guò)適配器類(lèi)(Adapter)逊脯,形成了更大的類(lèi)的結(jié)構(gòu)。

優(yōu)點(diǎn):
將目標(biāo)類(lèi)(Target)和適配者(Adaptee)解耦竣贪,具有良好的靈活性和擴(kuò)展性军洼,客戶端對(duì)此毫無(wú)所知。

缺點(diǎn):
類(lèi)適配器模式只能適配一個(gè)Adaptee演怎,因?yàn)閖ava不允許多繼承匕争,而且Adaptee類(lèi)不能是final的。

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末爷耀,一起剝皮案震驚了整個(gè)濱河市甘桑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖跑杭,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铆帽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡德谅,警方通過(guò)查閱死者的電腦和手機(jī)锄贼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)女阀,“玉大人宅荤,你說(shuō)我怎么就攤上這事〗撸” “怎么了冯键?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)庸汗。 經(jīng)常有香客問(wèn)我惫确,道長(zhǎng),這世上最難降的妖魔是什么蚯舱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任改化,我火速辦了婚禮,結(jié)果婚禮上枉昏,老公的妹妹穿的比我還像新娘陈肛。我一直安慰自己,他們只是感情好兄裂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布句旱。 她就那樣靜靜地躺著,像睡著了一般晰奖。 火紅的嫁衣襯著肌膚如雪谈撒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天匾南,我揣著相機(jī)與錄音啃匿,去河邊找鬼。 笑死蛆楞,一個(gè)胖子當(dāng)著我的面吹牛溯乒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臊岸,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼橙数,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼尊流!你這毒婦竟也來(lái)了帅戒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逻住,沒(méi)想到半個(gè)月后钟哥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞎访,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年腻贰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扒秸。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡播演,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伴奥,到底是詐尸還是另有隱情写烤,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布拾徙,位于F島的核電站洲炊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尼啡。R本人自食惡果不足惜暂衡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崖瞭。 院中可真熱鬧狂巢,春花似錦、人聲如沸书聚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寺惫。三九已至疹吃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間西雀,已是汗流浹背萨驶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艇肴,地道東北人腔呜。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像再悼,于是被迫代替她去往敵國(guó)和親核畴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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