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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/562886.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Hadoop】- YARN概述[6]

目录 一、YARN & Reduce 二、分布式资源调度 - YARN 1、资源调度 2、YARN的资源调度 总结 一、YARN & Reduce MapReduce是基于YARN运行的&#xff0c;即没有YARN “无法” 运行MapReduce程序。 二、分布式资源调度 - YARN YARN&#xff08;Yet Another Resou…

注意力机制中多层的作用

1.多层的作用 在注意力机制中&#xff0c;多层的作用通常指的是将注意力机制堆叠在多个层上&#xff0c;这在深度学习模型中被称为“深度”或“多层”注意力网络。这种多层结构的作用和实现过程如下&#xff1a; 1. **逐层抽象**&#xff1a;每一层都可以捕捉到输入数据的不同…

Oracle之SQL plus的一些经验心得

每次登入SQL plus后,不知道时哪个用户登入,非常不方便,只能使用show user查看。 以下时可以通过一些设置实现上述的效果,知道时哪个用户登入,和实现输出效果等 1)SQL plus使用细则 SQL plus登录时,我们可以设置一些通用的设置,在每次登入SQL plus的时候生效。 [root@c…

Eclipse+Java+Swing实现学生信息管理系统-TXT存储信息

一、系统介绍 1.开发环境 操作系统&#xff1a;Win10 开发工具 &#xff1a;Eclipse2021 JDK版本&#xff1a;jdk1.8 存储方式&#xff1a;Txt文件存储 2.技术选型 JavaSwingTxt 3.功能模块 4.工程结构 5.系统功能 1.系统登录 管理员可以登录系统。 2.教师-查看学生…

rmallox勒索病毒威胁网络安全:如何避免数据被锁定

尊敬的读者&#xff1a; 随着信息技术的飞速发展&#xff0c;网络空间的安全问题日益凸显。近年来&#xff0c;一种名为.rmallox的勒索病毒频繁出没&#xff0c;给广大计算机用户带来了严重的困扰。本文将对该病毒进行深入剖析&#xff0c;并探讨相应的应对策略。在面对被勒索…

VulnHub靶机 DC-7 打靶 渗透详细流程

VulnHub靶机 DC-7 实战打靶 详细渗透测试流程 目录 VulnHub靶机 DC-7 实战打靶 详细渗透测试流程一、将靶机配置文件导入虚拟机当中二、渗透测试流程主机发现端口扫描目录爆破web渗透白盒测试ssh远程连接 提权修改后台密码GETSHELL反弹shell 一、将靶机配置文件导入虚拟机当中 …

深度神经网络(DNN)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个深度神经网络&#xff08;DNN&#xff09;模型程序,最后打印5个条件分别的影响力。 示例 在深度神经网络&#xf…

【免费源码下载】完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城php+uniapp

简介 完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本&am…

51、图论-岛屿数量

思路&#xff1a; 该问题要求在一个由 1&#xff08;表示陆地&#xff09;和 0&#xff08;表示水&#xff09;组成的二维网格中&#xff0c;计算岛屿的数量。岛屿被水包围&#xff0c;并且通过水平或垂直连接相邻的陆地可以形成。这个问题的核心是识别并计数网格中相连的陆地…

ssm068海鲜自助餐厅系统+vue

海鲜自助餐厅系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管…

车载电子电器架构 —— 功能安全开发(首篇)

车载电子电器架构 —— 功能安全开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

go | defer、panic、recover

刷一道题&#xff0c; 将当函数触发panic 之后&#xff0c;函数是怎么执行的 然后我去找相关博客&#xff0c;发现这篇讲的蛮好的 接下来我直接上demo &#xff0c;然后通过demo 来逐个分析 package mainimport ("fmt" )func f() {defer func() {if r : recover();…

断言(Assertion)在IT技术中的确切含义— 基于四类典型场景的分析

当“断言”&#xff08;Assertion&#xff09;一词成为IT术语时&#xff0c;语义的混沌性和二义性也随之而生。那么&#xff0c;何为断言&#xff1f;断言何为&#xff1f;实际上&#xff0c;只需分析四种典型场景&#xff0c;确切答案和准确描述就将自然显现。 在SAML&#xf…

浏览器主页被“绑架”了?按照这个可以修改。

前言 小白是一个很喜欢看新闻的人&#xff0c;浏览器的默认主页通常都是MSN和百度的新闻&#xff0c;这可以说是习惯吧。 电脑用得好好的&#xff0c;有一天浏览器的主页被“绑架”了&#xff0c;变成了“hao***”。我知道&#xff0c;新一轮的检查又准备开始了。 上一次是Wi…

Docker - WEB应用实例

原文地址&#xff0c;使用效果更佳&#xff01; Docker - WEB应用实例 | CoderMast编程桅杆Docker - WEB应用实例 在之前的章节中&#xff0c;仅对普通容器进行了演示&#xff0c;但在实际中常常使用到 Docker 容器中的 WEB 应用程序。 运行一个WEB应用 拉取镜像 创建一个容器…

小型架构实验模拟

一 实验需求 二 实验环境 22 机器&#xff1a; 做nginx 反向代理 做静态资源服务器 装 nginx keepalived filebeat 44机器&#xff1a; 做22 机器的备胎 装nginx keepalived 99机器&#xff1a;做mysql的主 装mysqld 装node 装filebeat 77机器&#xff1a;做mysq…

ROS机器人实战,对标古月老师HRMRP机器人(一)——机器人总体方案设计

咳咳&#xff01;这个是自己的毕业设计&#xff0c;内容比较多就拆开发。设计实现了一款SLAM移动机器人&#xff0c;加机械臂完成视觉识别抓取的&#xff0c;同时还有语音识别控制、QT上位机控制、Web网页控制。前几年看古月老师的视频&#xff0c;看到古月老师设计的HRMRP&…

Python exe 文件反编译为 Python 脚本

文章目录 前言版本反编译Python 可执行文件&#xff08;.exe&#xff09;反编译打包一个简单的 .exe 可执行文件提取 pyc 文件使用脚本提取使用工具提取 将 .pyc 文件转换为 Python 脚本入口运行类非入口运行类转换补全后的 pyc 文件uncompyle6 反编译在线工具 可能遇到的问题P…

Web前端框架/库/工具

前言 前端从步枪&#xff08;原生js&#xff09;到了半自动武器&#xff08;jQuery&#xff09;并进化为全自动武器&#xff08;三大框架&#xff08;angular&#xff0c;react&#xff0c;vue及其生态链&#xff09;&#xff09;。 常说工欲善其事必先利其器。对于那些想要提…

前端入门:HTML(CSS边框综合案例)

案例&#xff1a; 源代码&#xff1a; css-borders.html: <body> <div id"square"> </div> <br> <div id"triangle"> </div> <br> <div id"trapezium"> </div> <br> <div id…