2023-6-15-第六式适配器模式

简介: 2023-6-15-第六式适配器模式

😉一、基础概念

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另外一个接口。适配器模式通常用于两个已有系统之间接口不兼容的情况下,或者在需要复用一个已有类而其接口不符合当前需求的情况下。

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

  1. 目标(Target):定义客户端所期望的接口,这是客户端代码所使用的接口。
  2. 适配器(Adapter):实现目标接口,并且持有一个被适配对象的引用。适配器将客户端请求转换成被适配对象可以处理的格式。
  3. 被适配对象(Adaptee):定义了原始接口,但与目标接口不兼容。
  4. 客户端(Client):调用目标接口来完成相应的业务逻辑。

在适配器模式中,适配器通过将客户端的请求转换成被适配对象可以处理的格式,从而使得客户端能够和被适配对象进行交互。适配器模式分为类适配器对象适配器两种实现方式。

类适配器使用多继承的方式,同时继承目标和被适配类,通过重写目标接口的方法来调用被适配类的方法。对象适配器使用组合的方式,将被适配类的实例作为一个成员变量,并实现目标接口,通过委托被适配类的方法来处理客户端请求。

适配器模式的优点在于能够提高系统的灵活性和可复用性,同时能够降低系统的耦合度。其缺点在于增加了系统的复杂度,并且可能会影响到代码的可读性和性能。


🐱‍🐉二、类适配器实现

C++类适配器是一种适配器模式的实现方式,用于将一个类的接口转换成另外一个客户端所期望的接口。下面是一个简单的C++类适配器的实现示例:

// 目标接口
class ITarget {
public:
    virtual void request() = 0;
};
// 被适配类
class Adaptee {
public:
    void specificRequest() {
        cout << "Adaptee::specificRequest" << endl;
    }
};
// 类适配器
class Adapter : public ITarget, private Adaptee {
public:
    void request() {
        specificRequest();
    }
};
// 客户端代码
int main() {
    ITarget* target = new Adapter();
    target->request();
    delete target;
    return 0;
}

在上述示例中,目标接口ITarget定义了客户端所期望的接口,被适配类Adaptee定义了原始接口,但与目标接口不兼容。适配器Adapter通过继承目标接口ITarget和被适配类Adaptee,并实现目标接口的方法request,从而能够将客户端请求转换成被适配对象可以处理的格式。客户端代码通过调用适配器的request方法来完成相应的业务逻辑。

需要注意的是,在这个示例中,适配器Adapter使用了多重继承的方式同时继承了目标接口ITarget和被适配类Adaptee,从而实现了接口的转换。此外,适配器Adapter在实现目标接口ITarget的request方法时,调用了被适配类Adaptee的specificRequest方法来处理客户端请求。


🎉三、对象适配器实现

C++对象适配器是一种适配器模式的实现方式,用于将一个类的接口转换成另外一个客户端所期望的接口。下面是一个简单的C++对象适配器的实现示例:

// 目标接口
class ITarget {
public:
    virtual void request() = 0;
};
// 被适配类
class Adaptee {
public:
    void specificRequest() {
        cout << "Adaptee::specificRequest" << endl;
    }
};
// 对象适配器
class Adapter : public ITarget {
public:
    Adapter(Adaptee* adaptee) : m_adaptee(adaptee) {}
    void request() {
        m_adaptee->specificRequest();
    }
private:
    Adaptee* m_adaptee;
};
// 客户端代码
int main() {
    Adaptee* adaptee = new Adaptee();
    ITarget* target = new Adapter(adaptee);
    target->request();
    delete target;
    delete adaptee;
    return 0;
}

在上述示例中,目标接口ITarget定义了客户端所期望的接口,被适配类Adaptee定义了原始接口,但与目标接口不兼容。适配器Adapter通过组合被适配类Adaptee,并实现目标接口ITarget的方法request,从而能够将客户端请求转换成被适配对象可以处理的格式。客户端代码创建了被适配类Adaptee的实例,并通过创建适配器Adapter的实例,并将被适配类Adaptee的实例传递给适配器,从而完成了相应的业务逻辑。

需要注意的是,在这个示例中,适配器Adapter使用了组合的方式来持有被适配类Adaptee的实例,并在实现目标接口ITarget的request方法时,通过委托被适配类Adaptee的specificRequest方法来处理客户端请求。


🐱‍🚀四、模块之间的关系

适配器模式主要涉及三个核心组件之间的关系:目标接口(Target)、适配器(Adapter)和被适配者(Adaptee)。

  1. 目标接口(Target):目标接口定义了客户端代码所期望的接口。它是客户端与适配器进行交互的方式,客户端通过调用目标接口定义的方法来完成相应的业务逻辑。
  2. 适配器(Adapter):适配器实现了目标接口,并且持有一个被适配者的引用。适配器的主要作用是将客户端对目标接口的调用转换成被适配者可以处理的格式或形式,从而使得客户端能够与被适配者进行交互。
  3. 被适配者(Adaptee):被适配者定义了原始接口,但与目标接口不兼容。被适配者是已经存在的类或模块,其功能和实现可能与目标接口不一致,需要通过适配器来进行转换以满足客户端的需求。

在适配器模式中,客户端通过调用目标接口来发起请求,适配器接收到这些请求后会将其转发给被适配者进行处理。适配器负责将客户端的请求转换为被适配者可以理解和处理的形式,同时还可以进行一些适配过程中的转换或调整操作。被适配者根据适配器传递过来的请求进行实际的处理,并将结果返回给适配器,然后适配器再将结果返回给客户端。

总结起来,适配器模式通过适配器将客户端与被适配者连接起来,使得不兼容的接口能够协同工作。适配器模式可以在现有系统中引入新功能、提高系统的灵活性和可复用性,并且能够降低系统之间的耦合度。


🎂五、注意事项

在使用适配器模式时,有一些注意事项需要考虑:

  1. 接口设计:在定义目标接口和被适配者接口时,需要充分考虑业务需求和系统设计,确保接口的一致性和灵活性。好的接口设计将减少适配器的复杂性和代码修改量。
  2. 适配器的选择:根据具体情况选择类适配器还是对象适配器。类适配器采用多重继承,可能对继承层次产生影响,并且无法适配被适配者的子类。对象适配器使用组合关系,能够适配被适配者的任意子类,并且更加灵活。
  3. 适配器的实现方式:适配器可以使用继承或组合来与被适配者进行连接。继承方式适用于已经存在的类或模块,而组合方式则更加灵活,可以适配不同类型的对象。
  4. 兼容性和稳定性:在适配过程中,需要确保适配器能够正确地转换客户端的请求并与被适配者进行交互,使得整个系统的行为一致且稳定。特别是在涉及到多个适配器和被适配者之间的协同工作时,要保证数据和状态的正确传递。
  5. 性能考虑:适配器模式可能会引入额外的中间层,对系统的性能产生一定的影响。在设计和使用适配器时,需要权衡性能与代码的可读性、可维护性,并进行必要的优化。
  6. 单一职责原则:一个适配器应该只负责适配相关的功能,遵循单一职责原则。如果一个适配器承担过多的功能,可能会导致代码复杂度增加,理解和维护困难。

总体而言,适配器模式是一种有用的设计模式,但在应用时应当谨慎选择和设计,确保它符合系统需求,并且不引入不必要的复杂性。


🥩六、使用场景

适配器模式通常适用以下场景:

  1. 老系统升级:在进行系统升级或重构时,可能需要引入新的组件或标准,而这些新的组件或标准与现有系统不兼容。使用适配器模式可以将新组件或标准适配到现有系统中,从而实现系统的平稳升级。
  2. 模块复用:在多个系统或模块之间存在共同点,但接口不一致的情况下,可以使用适配器模式将这些模块进行复用,提高代码的可维护性和复用性。
  3. 接口转换:在使用第三方库或接口时,可能需要对其进行适配以满足自身业务需求。适配器模式可以将第三方接口适配成符合自身需求的接口形式。
  4. 多态处理:在处理多态对象时,可以使用适配器模式将不同类型的对象适配到同一个接口上,以便进行统一的处理。
  5. 数据库访问:在使用不同类型的数据库时,可以使用适配器模式将不同的数据库适配到同一种数据访问接口上,从而使得代码更加灵活和可扩展。

🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于适配器模式的一些内容


目录
相关文章
|
6月前
|
数据采集 Prometheus 运维
基于LoongCollector构建全新可观测Pipeline
LoongCollector是阿里云推出的下一代可观测数据管道,旨在融合多种采集技术,构建统一的可观测数据代理。它具备高性能、可靠性和灵活性,支持日志、指标和追踪等多类型数据采集。通过模块化设计和SPL处理引擎,LoongCollector实现了高效的数据处理与传输,并大幅简化了配置管理。此外,集成eBPF技术,提供无侵入、高性能的应用性能监控,适用于复杂异构环境。未来,LoongCollector将继续优化性能、探索AI赋能的智能化采集。
|
存储 人工智能 自然语言处理
《百炼成金-大金融模型新篇章》––11.构建金融级AI原生的蓝图
百炼必定成金,新质生产力会催生新质劳动力,谨以此文抛砖引玉,希望与业内的各位朋友一同探讨如何积极拥抱并运用大模型技术,以应对和驾驭不断变化的市场环境,实现科技金融持续稳定的提质增效和创新发展,携手开启金融大模型未来新篇章。
299 4
|
9月前
|
敏捷开发 数据可视化 项目管理
快速提升工作效率:五大桌面工作安排软件深度评测
随着工作节奏的加快,合理高效地安排工作已成为职场人士和团队成功的关键。本文评测了五款流行的桌面工作安排软件:板栗看板、Trello、Asana、Notion 和 Microsoft To Do,帮助用户快速找到提升工作效率的最佳工具。每款软件都有其独特优势,如板栗看板的迭代管理、Trello 的灵活看板、Asana 的项目视图、Notion 的高度定制化以及 Microsoft To Do 的简洁易用。选择合适的工具,将有效提升个人和团队的工作效率。
193 1
|
11月前
|
人工智能 Kubernetes Cloud Native
利用通义灵码实现我的第一次开源贡献
本文将分享作者的开源之旅。
|
Java 程序员 C++
Java中CAS详解
Java中CAS详解
177 0
|
API Python
全面拥抱FastApi — 蓝图APIRouter
全面拥抱FastApi — 蓝图APIRouter
|
算法 PHP 数据安全/隐私保护
【必备工具】解密PHP超强在线工具,一键goto代码解密
goto解密工具,php开发者的福音,能有效解密复杂的goto加密代码,提升代码可读性和可维护性。支持单文件及项目目录一键解密,最大处理50M压缩文件。通过具体案例展示其在解决报错和理解复杂开源项目中的强大功能。立即体验:https://copy.kaidala.com/dala/goto/index.html
527 0
|
缓存 关系型数据库 数据库
构建高效后端系统的数据库优化策略
在后端开发中,数据库是核心组件之一,对系统性能和稳定性有着重要影响。本文将介绍一些常见的数据库优化策略,包括数据模型设计、索引优化、查询优化和缓存策略等,在实际开发中帮助提升后端系统的性能和响应速度。
|
Kubernetes 数据可视化 容器
部署Kubernetes集群+Dashboard可视化页面-1.18.6版本(二)
部署Kubernetes集群+Dashboard可视化页面-1.18.6版本(二)
1067 0
部署Kubernetes集群+Dashboard可视化页面-1.18.6版本(二)
|
Ubuntu 前端开发 JavaScript
前端破圈Win11系统下安装使用Ubuntu子系统🏴‍☠️
前端破圈Win11系统下安装使用Ubuntu子系统🏴‍☠️
245 0
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等