设计模式-- 3.适配器模式

适配器模式

在这里插入图片描述
将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

角色和职责

请求者(client):客户端角色,需要使用适配器的对象,不需要关心适配器内部的实现,只对接目标角色。
目标角色(Target):目标角色,和client直接对接,定义了client需要用到的接口。
这是客户所期待的接口。目标可角色以是具体的或抽象的类,也可以是接口。
源角色(Adaptee):源角色, 需要被进行适配的对象。也叫源对象。
适配器角色(Adapter):适配器角色 适配器,负责将源对象转化,给client做适配。
通过在内部包装一个源对象(Adaptee),把源接口转换成目标接口。
这四个角色是保证这个设计模式运行的关键。

代码演示

源角色

//源角色
class MyPrint 
{
public:void operator()(int v1, int v2){//重载operator()cout << v1 + v2 << endl;			}
};

目标角色

//目标角色
class Target
{
public:virtual void operator()(int v) = 0;virtual ~Target(){};
};

适配器角色

//适配器角色
class Adapter : public Target
{
public:Adapter(int param){this->param = param;};void operator()(int v) {myPrint(v,param);	}
private:MyPrint myPrint;int param;
};

客户角色

//client
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{vector<int> v;for(int i=0;i<10;i++){v.push_back(i);}//for_each(v.begin(),v.end(),MyPrint());//直接传入源角色对象,不满足条件,编译也不会通过for_each(v.begin(),v.end(),Adapter(12));//传入适配器,由适配器内部来操作。return 0;
}

使用for_each函数,需引入algorithm头文件,for_each函数需要三个参数,
第一个first 是迭代器,指向容器中第一个元素,
第二个last 是迭代器,指向容器中最后一个元素的下一个位置。
第三个fn 是一个可调用对象(函数指针、函数对象或Lambda表达式),它接受容器中元素的引用作为参数。
for_each函数原型:

template<class InputIterator, class Function>Function for_each(InputIterator first, InputIterator last, Function fn)
{for(;first!=last; ++first;) {fn (*first);}return fn;      // or, since C++11: return move(fn);
}

对于不同的函数调用,Function参数可以表示具有重载的()运算符的类类型。最终,for_ach()代码将具有一个使用fn()的表达式。
如果最后的for each()参数fn是指向函数的指针,而()调用该函数。
如果最后的for each()参数fn是一个函数对象(确切的说是函数对象),则fn将是调用其重载的operator()运算符的对象。(也是本例中我们使用的)。
for_each 函数 是一个模板函数,内部就是对内置的for循环语句的封装。基于模板可遍历符合要求所有容器元素。
函数对象:重载的operator()运算符的非抽象类,实例化出的对象,可称为函数对象。可以像调用函数一样使用函数对象加([参数])的方式,会自动调用重载的operator(),故而称之为函数对象。
在这里插入图片描述
适配器模式 UML类图中,客户端和目标角色直接对接。但是我们上面的例子中,for_each()中,传入的是一个函数对象。故而直接Client和适配器接触。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IEEE论文LaTeX模板解析(十一)| 尾页栏目均衡(Last Page Column Equalization)

本文收录于专栏&#xff1a;IEEE论文LaTeX模板解析&#xff0c;本专栏将会围绕IEEE论文LaTeX模板解析持续更新。欢迎点赞收藏关注&#xff01; 文章目录 IEEE 在最后一页平衡了各栏的长度。这种平衡是粗略的&#xff0c;因为参考文献或 IEEE 传记条目通常不会断开&#xff0c;…

Origin 或 Referer 的关系和区别

Origin 或 Referer 的关系和区别 Origin 和 Referer 都可以服务端用来做来源验证&#xff0c;来防止 csrf 攻击&#xff0c;都是浏览器自动带在请求头的但是&#xff0c;可以通过 Referrer Policy 来禁止请求携带 referer&#xff0c;【请求头增加字段 Referrer-Policy: no-ref…

TF-IDF(词频-逆文档频率)

文章目录 高频词只能说明词汇在评论中出现的频率高&#xff0c;但并不能说明这个词汇的重要性。利用关键词提取可以弥补这一不足&#xff0c;关键词提取是一种自动化的文本处理技术&#xff0c;它可以从一篇文章中自动抽取出最能代表文章主题和内容的若干个词语或短语。通常情况…

常用的检测数据异常值方式,以及异常数据如何处理!!

清除数据异常值 1.箱线图检测数据异常值方法2.3σ原则检测数据异常值方法3. 异常数据处理方式&#xff1a;总结&#xff08;小白看看就行&#xff09; 1.箱线图检测数据异常值方法 箱线图检测&#xff1a;箱线图是一种常用的异常值检测方法&#xff0c;它以数据的分位数为基础…

常见的加密算法

加密算法 AES 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥&#xff0c;具体的加密流程如下图&#xff1a; RSA RSA 加密算法是一种典型的非对称加密算法&am…

正则表达式2 常见模式

继上次的正则表达式速攻1/2-CSDN博客 还有一些常见的匹配模式可以直接使用 电子邮箱 xxxxxx.域名 的情况 \b[A-Za-z0-9._%-][A-Za-z0-9.-]\.[A-Z|a-z]{2,}\bhttp或者https网址 的情况 http[s]?://(?:[a-zA-Z]|[0-9]|[$-_.&]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F…

DRL入门

目录 1. DRL的核心概念 2. 算法分类 1、免模型学习和有模型学习&#xff08;理不理解所处的环境&#xff09; 2、基于策略&#xff08;概率&#xff09;的方法和基于价值的方法 3、回合更新和单步更新&#xff1a; 4、在线学习和离线学习 文献 1. Deep Reinforcement L…

Java后端开发——Mybatis实验

文章目录 Java后端开发——Mybatis实验一、MyBatis入门程序1.创建工程2.引入相关依赖3.数据库准备4.编写数据库连接信息配置文件5.创建POJO实体6.编写核心配置文件和映射文件 二、MyBatis案例&#xff1a;员工管理系统1.在mybatis数据库中创建employee表2.创建持久化类Employee…

嵌套的CMake

hehedalinux:~/Linux/multi-v1$ tree . ├── calc │ ├── add.cpp │ ├── CMakeLists.txt │ ├── div.cpp │ ├── mult.cpp │ └── sub.cpp ├── CMakeLists.txt ├── include │ ├── calc.h │ └── sort.h ├── sort │ ├── …

Java language programming:设计一个矩形类Rectangle

&#xff08;源于PTA&#xff09; 题目&#xff1a;设计一个名为Rectangle的类表示矩形。 这个类包括&#xff1a; <1>.两个名为width和height的double型数据域&#xff0c;它们分别表示矩形的宽和高。width和height的默认值都为1。 <2>.一个无参构造方法。 <3&…

网络安全工具大全

通用工具 工具类型 工具地址 更新时间 内网扫描 https://github.com/shadow1ng/fscan 2022-07-06 哥斯拉Webshell管理 https://github.com/BeichenDream/Godzilla 2021-11-01 ARL 资产侦察灯塔 https://github.com/TophantTechnology/ARL 2022-08-25 aliyun-accesskey-Too…

基于面向对象编程,C++实现单链表

链表&#xff1a;在内存空间中是非连续存储 组成&#xff1a;链表是由一个个节点组成的&#xff0c;每个节点都包含两个元素&#xff1a;数据和指针 节点头文件&#xff1a; 建立一个ListNode.h头文件 #pragma once class ListNode { public:int value;ListNode* next;Lis…

杭州经典爬山路线推荐

杭州经典爬山路线推荐爬山地图 【东岳村】路线一&#xff1a;东岳村(上山)——美人峰——龙门山——石人岭——天门山——石门山——棋盘山——天马山——茶叶博物馆&#xff08;下山&#xff09; 【林海亭】路线一&#xff1a;林海亭&#xff08;上山&#xff09;——唐家坞—…

设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式

思考一下 在线程1中如何终止线程2&#xff1f;stop()&#xff1f;还是System.exit()&#xff1f;还是其他方式 方式解答 1.使用stop()不可取 线程对象的stop()方法会直接杀死线程&#xff0c;假设此时使用了线程锁&#xff0c;当此时使用了stop()命令会导致线程锁无法释放&am…

当浏览器输入url的时候会发生什么?

说在前面 当我们在浏览器中输入URL并按下回车时&#xff0c;背后发生了一系列神秘的操作。本文将带您深入了解&#xff0c;从URL解析到页面渲染&#xff0c;揭秘浏览器输入URL的完整流程。 具体步骤 当浏览器输入URL时&#xff0c;一般经过以下细节步骤&#xff1a; 1、引言 …

利用Qt输出XML文件

使用Qt输出xml文件 void PixelConversionLibrary::generateXML() {QFile file("D:/TEST.xml");//创建xml文件if (!file.open(QIODevice::WriteOnly | QIODevice::Text))//以只写方式&#xff0c;文本模式打开文件{qDebug() << "generateXML:Failed to op…

语义分割miou指标计算详解

文章目录 1. 语义分割的评价指标2. 混淆矩阵计算2.1 np.bincount的使用2.2 混淆矩阵计算 3. 语义分割指标计算3.1 IOU计算方式1(推荐)方式2 3.2 Precision 计算3.3 总体的Accuracy计算3.4 Recall 计算3.5 MIOU计算 参考 MIoU全称为Mean Intersection over Union&#xff0c;平均…

Docker五部曲之三:镜像构建

文章目录 前言Docker构建架构构建指令构建上下文本地目录Git存储库压缩文件纯文本文件.dockerignore文件 Dockerfile解析器指令环境变量命令执行格式exec格式shell格式 FROMRUNCMDLABELEXPOSEENVADDCOPYENTRYPOINTVOLUMEUSERWORKDIRARGONBUILDSHELL 多级构建 前言 本文均翻译自…

java-ArrayBlockingQueue详解

在Java并发编程中&#xff0c;ArrayBlockingQueue是一个非常常用的工具类。它是一个由数组支持的有界阻塞队列&#xff0c;提供了线程安全的队列操作。 1.ArrayBlockingQueue概述 ArrayBlockingQueue是一个基于数组实现的阻塞队列&#xff0c;它继承自AbstractQueue并实现了B…

一周速递|全球车联网产业动态(2024年1月14日)

政策法规 1、1月9日&#xff0c;国家发展改革委、商务部、市场监管总局发布《关于支持广州南沙放宽市场准入与加强监管体制改革的意见》&#xff0c;提出加快智能&#xff08;网联&#xff09;汽车多场景试点应用及商业化运营&#xff0c;推动电动垂直起降飞行器&#xff08;e…