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 必須是接口檐薯。
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();
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)單左胞。
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)功心法