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. 数据库访问:在使用不同类型的数据库时,可以使用适配器模式将不同的数据库适配到同一种数据访问接口上,从而使得代码更加灵活和可扩展。

🍳参考文献

🧊文章总结

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

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


目录
相关文章
minio查询文件夹下面内容只返回了当前文件夹
minio查询文件夹下面内容的时候,路径最后一定要带个/,不然就是查询的当前文件夹自己
|
7月前
|
人工智能 语音技术 云计算
书尖 AI 功能实测|阿里云 AI 技术加持,与喜马拉雅听书体验深度对比
在阿里云AI赋能下,书尖AI实测展现三大优势:1.2亿册全品类书库、双人互动式AI播客、2分钟极速提炼书籍精华,并依托阿里云TTS实现自然听书体验。相较喜马拉雅,其AI深度解读与定制化能力更胜一筹。(239字)
1062 9
|
6月前
|
数据库 决策智能
多 Agent 验证架构实战:从输出评分到过程验证
2026年生产级Agent系统最典型失败:多步流水线中错误静默累积,最终输出流畅却全错。本文详解四种验证模式——输出评分、Reflexion、对抗辩论与过程验证,揭示其适用场景、失效边界及真实成本(验证器用小模型可降本10倍),强调验证层是演示与落地的分水岭。
446 0
多 Agent 验证架构实战:从输出评分到过程验证
|
存储 人工智能 自然语言处理
AI智能体从请求到响应,这系统过程中究竟藏着什么?
三桥君带你深入解析AI智能体从用户请求到生成响应的全流程,涵盖接入服务、智能体应用、知识检索、模型重排、LLM调用与工具执行等关键技术环节,揭开AI背后的运作原理。
693 2
|
SQL 关系型数据库 MySQL
常用的数据库链接工具都有哪些
常用的数据库链接工具都有哪些
2301 2
|
边缘计算 人工智能 5G
5G 组网模式:NSA 与 SA 的比较与应用
5G 组网模式:NSA 与 SA 的比较与应用
8676 1
|
监控 安全 网络安全
社会工程学:概念、技术与防范
社会工程学是一种利用人性弱点而非技术漏洞来获取敏感信息或进行攻击的策略。常见技术包括钓鱼攻击、预设信任、尾随、垃圾箱搜寻、电话欺诈和社交媒体工程。防范措施包括提高意识、双重验证、物理安全、信息管理和技术防护等。通过综合措施,可以有效降低社会工程学攻击的风险,保护信息安全。
1570 10
|
存储 人工智能 自然语言处理
LLM技术全景图:技术人必备的技术指南,一张图带你掌握从基础设施到AI应用的全面梳理
LLM技术全景图:技术人必备的技术指南,一张图带你掌握从基础设施到AI应用的全面梳理
LLM技术全景图:技术人必备的技术指南,一张图带你掌握从基础设施到AI应用的全面梳理
|
弹性计算 固态存储 大数据
阿里云服务器多少钱一年?2024年阿里云服务器价格表曝光!
2024年最新阿里云服务器租用费用优惠价格表,轻量2核2G3M带宽轻量服务器一年82元,折合6.8元1个月,新老用户同享99元一年服务器,2核4G5M服务器ECS优惠价199元一年,2核4G4M轻量服务器298元一年,2核4G服务器30元3个月,4核16G10M服务器26元1个月、149元半年,8核32G服务器90元1个月、271元3个月,阿小云整理阿里云服务器租用费用价格表,包括一年优惠价格、一个月和1小时收费明细表
1876 3
|
存储 SQL 关系型数据库

热门文章

最新文章