TS 設(shè)計(jì)模式04 - 適配器模式

1. 簡(jiǎn)介

筆記本實(shí)際上使用的是 12V 直流電,但是我們電源線是插在 220V 的交流電源上。我們不能把 220V 的交流電源直接改成符合要求的 12V 直流電源镀梭,因?yàn)椴槐阌谶\(yùn)輸猾编,也沒法讓筆記本直接使用 220V 的交流電,因?yàn)槠湓骷o法承擔(dān)朱灿。
220V 交流電源和筆記本本質(zhì)上是無法直接放到一起工作的,那么就需要電源適配器的輔助钠四。它能夠利用 220V 交流電源獲取電能盗扒,并轉(zhuǎn)換成 12V 直流電輸出給筆記本。
這就是適配器模式缀去,將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口侣灶。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。

2. 角色與分類

角色:

  • Target(目標(biāo)):客戶的目標(biāo)接口缕碎,可以是一個(gè)抽象類或接口褥影,也可以是具體類。
  • Adaptee(適配者):被適配的角色阎曹,是一個(gè)已有接口伪阶,但不符合客戶要求煞檩。
  • Adapter(適配器):將已有接口轉(zhuǎn)換成目標(biāo)接口

分類:

  • 類適配器模式
  • 對(duì)象適配器模式
  • 缺省適配器模式,也叫接口適配器模式

3. 類適配器模式

Adapter 可以繼承一個(gè)已有的 Adaptee栅贴,然后實(shí)現(xiàn) Target斟湃。這種情況下只能有一個(gè) Adaptee,且 Target 必須是接口檐薯。


image.png
interface PowerTarget {
    output12V(): string;
}

class PowerAdaptee {
    output220V() {
        return '220V 交流電';
    }
}

const adapt = (input) => {
    // TODO 具體轉(zhuǎn)換邏輯
    console.log(`${input} 被轉(zhuǎn)換成 12V 直流電`);
    return '12V 直流電';
};

class PowerAdapter extends PowerAdaptee implements PowerTarget {
    public output12V() {
        const input = this.output220V();
        console.log(`電源適配器開始工作凝赛,獲取:${input}`);
        const output = adapt(input);
        console.log(`電源適配器工作完成坛缕,輸出:${output}`);
        return output;
    }
}

const target: PowerTarget = new PowerAdapter();
target.output12V();
image.png

4. 對(duì)象適配器模式

Adapter 可以關(guān)聯(lián)個(gè)已有的 Adaptee墓猎,然后實(shí)現(xiàn) Target。這種情況下你要依賴多個(gè) Adaptee 實(shí)現(xiàn)也是 okay 的赚楚,Target 可以是接口也可以是抽象類甚至是類毙沾。
不過這里因?yàn)槭顷P(guān)聯(lián),所以改寫關(guān)聯(lián)對(duì)象的方法就很麻煩了宠页,不像繼承那么簡(jiǎn)單左胞。


image.png
interface PowerTarget {
    output12V(): string;
}

class PowerAdaptee {
    output220V(): string {
        return '220V 交流電';
    }
}

const adapt = (input) => {
    // TODO 具體轉(zhuǎn)換邏輯
    console.log(`${input} 被轉(zhuǎn)換成 12V 直流電`);
    return '12V 直流電';
};

class PowerAdapter implements PowerTarget {
    private powerAdaptee: PowerAdaptee;
    constructor() {
        this.powerAdaptee = new PowerAdaptee();
    }
    public output12V(): string {
        const input = this.powerAdaptee.output220V();
        console.log(`電源適配器開始工作,獲染倩А:${input}`);
        const output = adapt(input);
        console.log(`電源適配器工作完成烤宙,輸出:${output}`);
        return output;
    }
}

const target: PowerTarget = new PowerAdapter();
target.output12V();

5. 小結(jié)

其實(shí)還有一種缺省適配器模式,就是只想實(shí)現(xiàn) target 接口定義的部分方法俭嘁,那么在 adapter 和 target 之間加一層 defaultAdapter躺枕,用空方法實(shí)現(xiàn) target 的所有接口,真正的 adapter 就可以選擇性的重寫 defaultAdapter 中需要去適配的方法了供填。本質(zhì)上還是用的類適配器模式和對(duì)象適配器模式拐云。
可以看到,適配器模式捕虽,也可以看做是對(duì)方法的一種抽象慨丐,客戶依賴的接口不變,但是接口方法的實(shí)現(xiàn)可以用一個(gè)或多個(gè)現(xiàn)成的類來輔助實(shí)現(xiàn)泄私。

參考

適配器模式 - 百度百科
TypeScript 設(shè)計(jì)模式之適配器模式
TypeScript與設(shè)計(jì)模式(三)- 適配器
適配器模式 | 菜鳥教程
設(shè)計(jì)模式 | 適配器模式及典型應(yīng)用
適配器模式
圖解23種設(shè)計(jì)模式(TypeScript版)——前端必修內(nèi)功心法

最后編輯于
?著作權(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)離奇詭異,居然都是意外死亡泻骤,警方通過查閱死者的電腦和手機(jī)漆羔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門梧奢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人演痒,你說我怎么就攤上這事亲轨。” “怎么了鸟顺?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵惦蚊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我讯嫂,道長(zhǎng)蹦锋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任欧芽,我火速辦了婚禮莉掂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘千扔。我一直安慰自己巫湘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布昏鹃。 她就那樣靜靜地躺著尚氛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洞渤。 梳的紋絲不亂的頭發(fā)上阅嘶,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音载迄,去河邊找鬼讯柔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛护昧,可吹牛的內(nèi)容都是我干的魂迄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惋耙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼捣炬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绽榛,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤湿酸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后灭美,有當(dāng)?shù)厝嗽跇淞掷锇l(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
  • 文/蒙蒙 一哩都、第九天 我趴在偏房一處隱蔽的房頂上張望魁兼。 院中可真熱鬧,春花似錦漠嵌、人聲如沸咐汞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)化撕。三九已至,卻和暖如春约炎,著一層夾襖步出監(jiān)牢的瞬間植阴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工圾浅, 沒想到剛下飛機(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