0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

TypeScript設(shè)計模式之適配器模式介紹

冬至子 ? 來源:全棧修仙之路 ? 作者:semlinker ? 2023-11-23 17:33 ? 次閱讀

No.1****簡介

在實際生活中,也存在適配器的使用場景,比如:港式插頭轉(zhuǎn)換器、電源適配器和 USB 轉(zhuǎn)接口。而在軟件工程中,適配器模式的作用是解決兩個軟件實體間的接口不兼容的問題。使用適配器模式之后,原本由于接口不兼容而不能工作的兩個軟件實體就可以一起工作。

No.2****優(yōu)缺點

優(yōu)點

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

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

? 靈活性和擴(kuò)展性都非常好,通過使用配置文件,可以很方便地更換適配器,也可以在不修改原有代碼的基礎(chǔ)上增加新的適配器類,符合開閉原則。

缺點

? 過多地使用適配器,會讓系統(tǒng)非常零亂,不易整體進(jìn)行把握。

No.3****應(yīng)用場景

? 系統(tǒng)需要使用現(xiàn)有的類,而這些類的接口不符合系統(tǒng)的需要。

? 想要建立一個可以重復(fù)使用的類,用于與一些彼此之間沒有太大關(guān)聯(lián)的一些類,包括一些可能在將來引進(jìn)的類一起工作。

No.4

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

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

? Target:目標(biāo)抽象類

? Adapter:適配器類

? Adaptee:適配者類

? Client:客戶類

適配器模式有對象適配器和類適配器兩種實現(xiàn),這里我們主要介紹對象適配器。

對象適配器:

圖片

No.5

實戰(zhàn)

具體實現(xiàn)

定義 Target 接口

interface Target {
request(): void;
}

創(chuàng)建 Adaptee(適配者) 類

class Adaptee {
public specificRequest(): void {
console.log("specificRequest of Adaptee is being called");
}
}

創(chuàng)建 Adapter(適配器)類

class Adapter implements Target {
public request(): void {
console.log("Adapter's request method is being called");
var adaptee: Adaptee = new Adaptee();
adaptee.specificRequest();
}
}

使用示例


function show(): void {
const adapter: Adapter = new Adapter();
adapter.request();
}

為了更好地理解適配器模式的作用,我們來舉一個實際的應(yīng)用示例。假設(shè)你現(xiàn)在擁有一個日志系統(tǒng),該日志系統(tǒng)會將應(yīng)用程序生成的所有信息保存到本地文件,具體如下:

interface Logger {
info(message: string): Promisevoid>;
}

class FileLogger implements Logger {
public async info(message: string): Promisevoid> {
console.info(message);
console.info('This Message was saved with FileLogger');
}
}

基于上述的 FileLogger 類,我們就可以在 NotificationService 通知服務(wù)中使用它:

class NotificationService {
protected logger: Logger;

constructor (logger: Logger) {
this.logger = logger;
}

public async send(message: string): Promisevoid> {
await this.logger.info(`Notification sended: ${message}`);
}
}

(async () => {
const fileLogger = new FileLogger();
const notificationService = new NotificationService(fileLogger);
await notificationService.send('Hello Semlinker, To File');
})();

以上代碼成功運行后會輸出以下結(jié)果:

Notification sended: Hello Semlinker
This Message was saved with FileLogger

但是現(xiàn)在我們需要使用一種新的方式來保存日志,因為隨著應(yīng)用的增長,我們需要將日志保存到云服務(wù)器上,而不再需要保存到本地磁盤中。因此我們需要使用另一種實現(xiàn),比如:

interface CloudLogger {
sendToServer(message: string, type: string): Promisevoid>;
}

class AliLogger implements CloudLogger {
public async sendToServer(message: string, type: string): Promisevoid> {
console.info(message);
console.info('This Message was saved with AliLogger');
}
}

但這時對于我們來說,要使用這個新類,我們就可能需要重構(gòu)舊的代碼以使用新的日志存儲方式。為了避免重構(gòu)代碼,我們可以考慮使用適配器來解決這個問題。

class CloudLoggerAdapter implements Logger {
protected cloudLogger: CloudLogger;

constructor (cloudLogger: CloudLogger) {
this.cloudLogger = cloudLogger;
}

public async info(message: string): Promisevoid> {
await this.cloudLogger.sendToServer(message, 'info');
}
}

在定義好 CloudLoggerAdapter 適配器之后,我們就可以這樣使用:

(async () => {
const aliLogger = new AliLogger();
const cloudLoggerAdapter = new CloudLoggerAdapter(aliLogger);
const notificationService = new NotificationService(cloudLoggerAdapter);
await notificationService.send('Hello Kakuqo, To Cloud');
})();

以上代碼成功運行后會輸出以下結(jié)果:

Notification sended: Hello Kakuqo, To Cloud
This Message was saved with AliLogger

如你所見,適配器模式是一個非常有用的模式,對于任何開發(fā)人員來說,理解這種模式都是至關(guān)重要的。

日志系統(tǒng)適配器完整示例

接口定義

interface Logger {
info(message: string): Promisevoid>;
}

interface CloudLogger {
sendToServer(message: string, type: string): Promisevoid>;
}

日志實現(xiàn)類

class AliLogger implements CloudLogger {
public async sendToServer(message: string, type: string): Promisevoid> {
console.info(message);
console.info('This Message was saved with AliLogger');
}
}

適配器

class CloudLoggerAdapter implements Logger {
protected cloudLogger: CloudLogger;

constructor (cloudLogger: CloudLogger) {
this.cloudLogger = cloudLogger;
}

public async info(message: string): Promisevoid> {
await this.cloudLogger.sendToServer(message, 'info');
}
}

通知服務(wù)類

class NotificationService {
protected logger: Logger;

constructor (logger: Logger) {
this.logger = logger;
}

public async send(message: string): Promisevoid> {
await this.logger.info(`Notification sended: ${message}`);
}
}

使用示例

(async () => {
const aliLogger = new AliLogger();
const cloudLoggerAdapter = new CloudLoggerAdapter(aliLogger);
const notificationService = new NotificationService(cloudLoggerAdapter);
await notificationService.send('Hello Kakuqo, To Cloud');
})();
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 轉(zhuǎn)換器
    +關(guān)注

    關(guān)注

    27

    文章

    8574

    瀏覽量

    146534
  • USB接口
    +關(guān)注

    關(guān)注

    9

    文章

    697

    瀏覽量

    55490
  • 適配器
    +關(guān)注

    關(guān)注

    8

    文章

    1899

    瀏覽量

    67767
  • 電源適配器
    +關(guān)注

    關(guān)注

    14

    文章

    646

    瀏覽量

    43005
收藏 人收藏

    評論

    相關(guān)推薦

    適配器模式和代理模式的區(qū)別

    對象可以在客戶端和目標(biāo)對象之間起到中介的作用,這樣起到了中介的作用和保護(hù)了目標(biāo)對象的作用?! 。?)高擴(kuò)展性    適配器模式  在計算機編程中,適配器模式(有時候也稱包裝樣式或者包裝
    發(fā)表于 10-22 15:17

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

    目錄第一章 適配器模式介紹第二章 適配器模式實現(xiàn)(類適配器)2.1、關(guān)系依賴圖2.2、創(chuàng)建交流電
    發(fā)表于 09-15 07:11

    適配器模式的作用

    適配器模式的作用是解決兩個軟件實體間的接口不兼容的問題。使用適配器模式之后,原本由于接口不兼容而不能工作的兩個軟件實體可以一起工作。港式插頭轉(zhuǎn)換器
    發(fā)表于 11-11 06:30

    缺省適配器模式基本概念

    在這一節(jié)我們就看一看第一類:缺省適配器模式一、缺省適配器模式基本概念1.1 說明當(dāng)不需要全部實現(xiàn)接口提供的方法時,可以設(shè)計一個適配器抽象類實
    發(fā)表于 11-11 07:53

    對象適配器模式基本概念

    在這一節(jié)我們就看一看第一類:對象適配器模式一、對象適配器模式基本概念1.1 說明對象適配器模式
    發(fā)表于 11-11 07:09

    什么是硬件適配器模式

    硬件適配器模式提供一種方法,使已經(jīng)存在的硬件接口能適應(yīng)應(yīng)用期望。當(dāng)應(yīng)用需要使用一個接口而硬件提供另一種時,硬件適配器模式創(chuàng)建元素在兩個接口之間進(jìn)行轉(zhuǎn)換。
    發(fā)表于 12-21 07:55

    適配器模式、裝飾器模式、代理模式的區(qū)別

    適配器模式、裝飾器模式、代理模式都屬于設(shè)計模式中的結(jié)構(gòu)型模式,結(jié)構(gòu)型設(shè)計
    發(fā)表于 10-18 15:53 ?1.7w次閱讀
    <b class='flag-5'>適配器</b><b class='flag-5'>模式</b>、裝飾器<b class='flag-5'>模式</b>、代理<b class='flag-5'>模式</b>的區(qū)別

    適配器模式和代理模式的區(qū)別

    適配器模式適配器模式有時候也稱包裝樣式或者包裝。將一個類的接口轉(zhuǎn)接成用戶所期待的。代理模式:為其他對象提供一種代理以控制對這個對象的訪問。
    發(fā)表于 01-12 11:56 ?5250次閱讀
    <b class='flag-5'>適配器</b><b class='flag-5'>模式</b>和代理<b class='flag-5'>模式</b>的區(qū)別

    適配器模式和裝飾模式的區(qū)別

    裝飾模式指的是在不必改變原類文件和使用繼承的情況下,動態(tài)地擴(kuò)展一個對象的功能。它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實的對象。在計算機編程中,適配器模式(有時候也稱包裝樣式或者包裝)將一個類的接口
    發(fā)表于 01-15 10:31 ?6941次閱讀
    <b class='flag-5'>適配器</b><b class='flag-5'>模式</b>和裝飾<b class='flag-5'>模式</b>的區(qū)別

    java適配器模式實例

    java適配器模式將一個類的接口轉(zhuǎn)換成客戶想要的另一個接口,適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。 適配器
    發(fā)表于 01-15 11:00 ?3795次閱讀

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

    適配器模式的作用是解決兩個軟件實體間的接口不兼容的問題。使用適配器模式之后,原本由于接口不兼容而不能工作的兩個軟件實體可以一起工作。港式插頭轉(zhuǎn)換器
    發(fā)表于 11-06 16:21 ?5次下載
    JavaScript設(shè)計<b class='flag-5'>模式</b><b class='flag-5'>之</b><b class='flag-5'>適配器</b><b class='flag-5'>模式</b>

    大話設(shè)計模式之愛你一萬年:第六章 結(jié)構(gòu)型模式適配器模式:i7愛妻:為愛找份工作:4.適配器模式缺省適配器

    在這一節(jié)我們就看一看第一類:缺省適配器模式一、缺省適配器模式基本概念1.1 說明當(dāng)不需要全部實現(xiàn)接口提供的方法時,可以設(shè)計一個適配器抽象類實
    發(fā)表于 11-06 19:21 ?9次下載
    大話設(shè)計<b class='flag-5'>模式</b>之愛你一萬年:第六章 結(jié)構(gòu)型<b class='flag-5'>模式</b>:<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>:i7愛妻:為愛找份工作:4.<b class='flag-5'>適配器</b><b class='flag-5'>模式</b><b class='flag-5'>之</b>缺省<b class='flag-5'>適配器</b>

    大話設(shè)計模式之愛你一萬年:第六章 結(jié)構(gòu)型模式適配器模式:i7愛妻:為愛找份工作:3.適配器模式對象適配器

    在這一節(jié)我們就看一看第一類:對象適配器模式一、對象適配器模式基本概念1.1 說明對象適配器模式
    發(fā)表于 11-06 19:51 ?12次下載
    大話設(shè)計<b class='flag-5'>模式</b>之愛你一萬年:第六章 結(jié)構(gòu)型<b class='flag-5'>模式</b>:<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>:i7愛妻:為愛找份工作:3.<b class='flag-5'>適配器</b><b class='flag-5'>模式</b><b class='flag-5'>之</b>對象<b class='flag-5'>適配器</b>

    設(shè)計模式-適配器模式-以電壓適配器為例

    超級鏈接: Java常用設(shè)計模式的實例學(xué)習(xí)系列-緒論參考:《HeadFirst設(shè)計模式》1.關(guān)于適配器模式適配器
    發(fā)表于 11-07 09:36 ?17次下載
    設(shè)計<b class='flag-5'>模式</b>-<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>-以電壓<b class='flag-5'>適配器</b>為例

    設(shè)計模式中什么是適配器模式

    適配器模式(Adapter),將一個類的接口適配成用戶所期待的。
    的頭像 發(fā)表于 08-02 10:00 ?730次閱讀
    設(shè)計<b class='flag-5'>模式</b>中什么是<b class='flag-5'>適配器</b><b class='flag-5'>模式</b>?