0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TypeScript设计模式之适配器模式介绍

冬至子 来源:全栈修仙之路 作者:semlinker 2023-11-23 17:33 次阅读

No.1****简介

在实际生活中,也存在适配器的使用场景,比如:港式插头转换器电源适配器和 USB接口。而在软件工程中,适配器模式的作用是解决两个软件实体间的接口不兼容的问题。使用适配器模式之后,原本由于接口不兼容而不能工作的两个软件实体就可以一起工作。

No.2****优缺点

优点

• 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。

• 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。

• 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,符合开闭原则。

缺点

• 过多地使用适配器,会让系统非常零乱,不易整体进行把握。

No.3****应用场景

• 系统需要使用现有的类,而这些类的接口不符合系统的需要。

• 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

No.4

模式结构

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

• Target:目标抽象类

Adapter:适配器类

• Adaptee:适配者类

• Client:客户类

适配器模式有对象适配器和类适配器两种实现,这里我们主要介绍对象适配器。

对象适配器:

图片

No.5

实战

具体实现

定义 Target 接口

interface Target {
request(): void;
}

创建 Adaptee(适配者) 类

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

创建 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();
}

为了更好地理解适配器模式的作用,我们来举一个实际的应用示例。假设你现在拥有一个日志系统,该日志系统会将应用程序生成的所有信息保存到本地文件,具体如下:

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 通知服务中使用它:

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');
})();

以上代码成功运行后会输出以下结果:

Notification sended: Hello Semlinker
This Message was saved with FileLogger

但是现在我们需要使用一种新的方式来保存日志,因为随着应用的增长,我们需要将日志保存到云服务器上,而不再需要保存到本地磁盘中。因此我们需要使用另一种实现,比如:

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');
}
}

但这时对于我们来说,要使用这个新类,我们就可能需要重构旧的代码以使用新的日志存储方式。为了避免重构代码,我们可以考虑使用适配器来解决这个问题。

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');
})();

以上代码成功运行后会输出以下结果:

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

如你所见,适配器模式是一个非常有用的模式,对于任何开发人员来说,理解这种模式都是至关重要的。

日志系统适配器完整示例

接口定义

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

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');
}
}

适配器

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');
}
}

通知服务类

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');
})();
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 转换器
    +关注

    关注

    27

    文章

    8207

    浏览量

    141838
  • USB接口
    +关注

    关注

    9

    文章

    672

    浏览量

    54987
  • 适配器
    +关注

    关注

    8

    文章

    1822

    浏览量

    66942
  • 电源适配器
    +关注

    关注

    13

    文章

    573

    浏览量

    42547
收藏 人收藏

    评论

    相关推荐

    适配器模式和代理模式的区别

    对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。  (3)高扩展性    适配器模式  在计算机编程中,适配器模式(有时候也称包装样式或者包装
    发表于 10-22 15:17

    适配器模式实现

    目录第一章 适配器模式介绍第二章 适配器模式实现(类适配器)2.1、关系依赖图2.2、创建交流电
    发表于 09-15 07:11

    适配器模式的作用

    适配器模式的作用是解决两个软件实体间的接口不兼容的问题。使用适配器模式之后,原本由于接口不兼容而不能工作的两个软件实体可以一起工作。港式插头转换器
    发表于 11-11 06:30

    缺省适配器模式基本概念

    在这一节我们就看一看第一类:缺省适配器模式一、缺省适配器模式基本概念1.1 说明当不需要全部实现接口提供的方法时,可以设计一个适配器抽象类实
    发表于 11-11 07:53

    对象适配器模式基本概念

    在这一节我们就看一看第一类:对象适配器模式一、对象适配器模式基本概念1.1 说明对象适配器模式
    发表于 11-11 07:09

    什么是硬件适配器模式

    硬件适配器模式提供一种方法,使已经存在的硬件接口能适应应用期望。当应用需要使用一个接口而硬件提供另一种时,硬件适配器模式创建元素在两个接口之间进行转换。
    发表于 12-21 07:55

    适配器模式、装饰器模式、代理模式的区别

    适配器模式、装饰器模式、代理模式都属于设计模式中的结构型模式,结构型设计
    发表于 10-18 15:53 1.6w次阅读
    <b class='flag-5'>适配器</b><b class='flag-5'>模式</b>、装饰器<b class='flag-5'>模式</b>、代理<b class='flag-5'>模式</b>的区别

    适配器模式和代理模式的区别

    适配器模式适配器模式有时候也称包装样式或者包装。将一个类的接口转接成用户所期待的。代理模式:为其他对象提供一种代理以控制对这个对象的访问。
    发表于 01-12 11:56 5160次阅读
    <b class='flag-5'>适配器</b><b class='flag-5'>模式</b>和代理<b class='flag-5'>模式</b>的区别

    java适配器模式实例

    java适配器模式将一个类的接口转换成客户想要的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器
    发表于 01-15 11:00 3715次阅读

    大话设计模式之爱你一万年:第六章 结构型模式适配器模式:i7爱妻:为爱找份工作:3.适配器模式之对象适配器

    在这一节我们就看一看第一类:对象适配器模式一、对象适配器模式基本概念1.1 说明对象适配器模式
    发表于 11-06 19:51 12次下载
    大话设计<b class='flag-5'>模式</b>之爱你一万年:第六章 结构型<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>

    设计模式-适配器模式-以电压适配器为例

    超级链接: Java常用设计模式的实例学习系列-绪论参考:《HeadFirst设计模式》1.关于适配器模式适配器
    发表于 11-07 09:36 17次下载
    设计<b class='flag-5'>模式</b>-<b class='flag-5'>适配器</b><b class='flag-5'>模式</b>-以电压<b class='flag-5'>适配器</b>为例

    适配器模式设计

    适配器模式一般是在我们要把”现有的对象“应用到新的环境中时使用,通过编写一个Adapter类,把原有的类应用到新的类中,而不必修改原有类,也不必重写已有类。
    的头像 发表于 06-01 14:22 416次阅读
    <b class='flag-5'>适配器</b><b class='flag-5'>模式</b>设计

    设计模式结构性:适配器模式

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
    的头像 发表于 06-07 11:56 569次阅读
    设计<b class='flag-5'>模式</b>结构性:<b class='flag-5'>适配器</b><b class='flag-5'>模式</b>

    设计模式中什么是适配器模式

    适配器模式(Adapter),将一个类的接口适配成用户所期待的。
    的头像 发表于 08-02 10:00 510次阅读
    设计<b class='flag-5'>模式</b>中什么是<b class='flag-5'>适配器</b><b class='flag-5'>模式</b>?

    适配器是什么?适配器模式有几种常见的类型?

    适配器是什么?适配器模式有几种常见的类型? 适配器是一个接口转换器,它可以是一个独立的硬件接口设备,允许硬件或电子接口与其它硬件或电子接口相连,也可以是信息接口。比如:电源
    的头像 发表于 12-11 11:26 631次阅读