C++设计模式:适配器模式(十四)

server/2024/10/22 12:19:59/
1、定义与动机
  • 定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。

  • 动机:

    • 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但新环境要求的接口是这些现存对象所不满足的。
    • 如何应对这种“迁移的变化”?如何既能利用现有对象的良好视线同时又能满足心得应用环境所要求的接口?
  • 个人理解:适配器模式很常见也非常有用,生活中到处都是适配,电脑VGA和HDMI转接口、水管弯头、变压器是不是也可以认为是一种适配器…它主要是为了解决已有物体与现在需求物不匹配的一个情况,进行一层封装(转接口、弯头)以达到复用的效果

2、实现代码
  • 适配器模式的代码并没有一个统一的标准,其主要体现在加一层封装调用老接口的一种形式

  • 当出现老接口与目标接口不匹配时,此时适配器模式就可以很好的适用进来。

// 老接口
class IAdaptee {
public:virtual void foo(int data) = 0;virtual int bar() = 0;
};
class Adaptee:public IAdaptee {
public:virtual void foo(int data) override{}virtual int bar() override{}
};// 目标接口
class ITarget{
public:virtual void process() = 0;
};class Adapter: public IAdaptee{
private:IAdaptee* adaptee;				// 多态
public:Adapter(IAdaptee *iAdaptee): adaptee(iAdaptee){}virtual void process() override{// ...int data = adaptee->bar();adaptee->foo(data);// ...}
};
3、总结

在这里插入图片描述

  • Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用

  • GoF 23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用“多继承”的实现方式,一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。

    // 多继承, 类适配器   高耦合,并且无法动态的适应老接口(老接口可能存在多个)
    class Adapter: public IAdaptee, private IAdaptee {};
    
  • Adapter模式可以实现的非常灵活,不必拘泥于GoF 23中定义的两种接口。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。

  • 适用场景:老接口与目标接口不匹配时,用于解决一个兼容性问题

    • STL中stack栈和queue队列都是基于一个deque做的实现,这就是一种适配器。

      template<typename _Tp, typename _Sequence = deque<_Tp> >
      class queue;
      template<typename _Tp, typename _Sequence = deque<_Tp> >
      class stack
      
    • SpringMVC Framework中在解析Web请求的参数时也会存在多种适配器用于解析不同类型的参数,但它们都是通过一个HandlerAdapter的接口来进行选择调用具体的适配器来适配解析参数

      // 找到处理器的适配器
      HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {private List<HandlerAdapter> handlerAdapters;if (this.handlerAdapters != null) {for (HandlerAdapter adapter : this.handlerAdapters) {if (adapter.supports(handler)) {return adapter;}}}
      }// 获取参数、执行controller
      mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
      

http://www.ppmy.cn/server/13374.html

相关文章

GPT-3和自然语言处理的前沿:思考AI大模型的发展

引言 自然语言处理&#xff08;NLP&#xff09;是人工智能&#xff08;AI&#xff09;领域中最富有挑战性和活跃的研究领域之一。近年来&#xff0c;随着深度学习技术的发展和计算能力的提高&#xff0c;大型语言模型&#xff0c;尤其是OpenAI的GPT-3&#xff0c;已成为推动该…

Vue js闭包

JavaScript闭包详解 在JavaScript中&#xff0c;闭包是一个非常重要的概念&#xff0c;也是JavaScript区别于其他语言的一大特色。理解闭包不仅有助于提升我们的编程技能&#xff0c;还能让我们更好地利用JavaScript的特性和优势。本文将详细解析闭包的概念、原理、应用以及相…

STM32 USB虚拟串口

电路原理图 usb部分 晶振部分 usb与单片机连接 配置信息 sys配置信息 rcc配置信息 usb配置信息 虚拟串口配置信息 时钟配置信息 项目配置信息 代码 包含文件 主函数代码 实验效果 修改接收波特率依然可以正常接收&#xff0c;也就是说单片机可以自动适应上位机的波特率设置。…

hive SQL谓词下推

Sql 优化&#xff1a;谓词下推&#xff08;PPD 定义 谓词下推的概念其实出现在sql中&#xff0c;在关联查询时(join&#xff0c;left join ,right join),因为涉及两个大表之间的关联(特别是在hive)造成资源消耗会比较大&#xff0c; 因为建议在join之前先将两个表进行过滤(hive…

软件测试(Web自动化测试)

一.自动化测试简介 1.自动化测试是一种把人工驱动的测试行为转化为机器执行的测试过程。 2.使用自动化测试需要满足的3个条件&#xff1a; &#xff08;1&#xff09;项目需求变动不频繁 &#xff08;2&#xff09;项目进度压力不大&#xff0c;时间不紧迫 &#xff08;3&…

Python常见运算符

赋值运算符 赋值运算符主要用来对变量进行赋值,包括如下这些: 运算符 描述 赋值加等于 - 减等于 * 乘等于 / 除等于 // 整除等于 % 模等于 ** 幂等于实例如下: a 10 a 5 # 等价于 a a5 a *2 # 等价于 a a*2比较运算符 比较运算符主要用来比较两个数据的大小,包括如下这…

大模型日报2024-04-24

大模型日报 2024-04-24 大模型资讯 Google DeepMind的RecurrentGemma模型超越变压器模型 摘要: Google DeepMind的最新研究成果RecurrentGemma模型在性能上超过了基于变压器的模型&#xff0c;并且使用的资源更少。这一突破为人工智能领域提供了一个高效的模型选择&#xff0c;…

Ubuntu搭建Python虚拟环境:virtualenv

1 缘起 一阶段&#xff1a;Python开发&#xff0c;使用Windows环境&#xff0c;使用的相关依赖在Windows环境都能使用&#xff1b; 进入二阶段&#xff0c;开发了一个新功能&#xff0c;使用了k8s&#xff0c;Python依赖为&#xff1a;easy_k8s&#xff0c; 刚好&#xff0c;e…