用C++跟你聊聊“适配器模式”
时间:2022-07-23
本文章向大家介绍用C++跟你聊聊“适配器模式”,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
电源适配器
何为适配器?大家都知道,我国的标准电压是220V,但是我们平时使用的电器可接受不了这个电压,比方说电脑、手机,认真去看他们的充电器,还有一个名字,叫电源适配器适配器是干嘛用的?就是将功能相似或相同、但是接口不同的东西,使得他们可以对接。就像电插座和电器插口,功能都是通电,但是电压不同,适配器就起这么一个中间人的作用。又比如翻译,两个不同语言的人进行通话,相同点都是在讲话和听话,但是不同的是语言,翻译就起到中间转换的作用。
适配器并不能改变事物原有的功能,它只是把输入的功能以它该输出的方式进行输出。
适配器模式类图
类模式适配器
对象模式适配器
适配器模式实现
#include <iostream>
using namespace std;
//目标接口类,客户需要的接口
class Target
{
public:
Target(){};
virtual ~Target(){};
virtual void Request();//定义标准接口
{
cout << "Target::Request()" << endl;
}
};
//需要适配的类
class Adaptee
{
public:
Adaptee(){};
~Adaptee(){};
void Adaptee::SpecificRequest()
{
cout << "Adaptee::SpecificRequest()" << endl;
}
};
//类模式,适配器类,通过public继承获得接口继承的效果,通过private继承获得实现继承的效果
class Adapter:public Target,private Adaptee
{
public:
Adapter(){};
~Adapter(){};
virtual void Request();//实现Target定义的Request接口
{
cout << "Adapter::Request()" << endl;
this->SpecificRequest();
cout << "----------------------------" <<endl;
}
};
//对象模式,适配器类,继承Target类,采用组合的方式实现Adaptee的复用
class Adapter1:public Target
{
public:
Adapter1::Adapter1(Adaptee* _adaptee)
{
this->_adaptee = _adaptee;
}
Adapter1();
~Adapter1();
virtual void Request();//实现Target定义的Request接口
{
cout << "Adapter1::Request()" << endl;
this->_adaptee->SpecificRequest();
cout << "----------------------------" <<endl;
}
private:
Adaptee* _adaptee;
};
int main()
{
//类模式Adapter
Target* pTarget = new Adapter();
pTarget->Request();
//对象模式Adapter1
Adaptee* ade = new Adaptee();
Target* pTarget1= new Adapter1(ade);
pTarget1->Request();
//对象模式Adapter2
Target* pTarget2 = new Adapter1();
pTarget2->Request();
return 0;
}
适用场景
学习了这么些设计模式,还没遇到这么简单却实用的模式。但是,“适配器模式”好归好,可不要本末倒置。 如果在开发期间出现不适配,最好直接重构。
适配器一般是用于双方代码都不太容易修改的时候,比方说使用第三方库,发现和自己的项目不适配、比方说要复用过去的功能块,但是规格已经变过了等等。
扁鹊治病的小故事
如有雷同,那就是我借鉴了人家的故事。主要就是为了告诉大家,这个模式,就像“亡羊补牢”般。
传说有个国王问扁鹊,你们家兄弟三人,都·精通医术,那么谁的医术更加高明? 扁鹊回答说:我大哥最强,然后是我二哥,我是真的菜。 国王又问:那为什么你的名声最大? 扁鹊说:我大哥治病,都是打疫苗,所以人家不觉得他会治病;我二哥治病,都是在病情刚刚露头的时候就掐灭,所以人家都觉得他只会治疗一些小毛病;而我都是在人家病重的时候才发现,所以动作都是大手笔,人家才把我的名声传出去。所以说,我大哥是最强的,其次是我二哥,我是最菜的那个。
- spring boot 实现mysql读写分离
- spring boot集成druid连接池
- spring boot整合dubbox进行服务拆分
- Spring Cloud中如何保证各个微服务之间调用的安全性
- Spring Boot Actuator监控页面报错解决
- Spring Cloud中如何优雅的使用Feign调用接口
- Spring Cloud Eureka 集群高可用
- Spring Cloud Eureka 增加权限认证
- Spring Cloud Eureka 初探
- 房价网是怎么使用分布式作业框架elastic-job
- Spring Cloud Sleuth Zipkin 展示追踪数据
- Spring cloud Zuul Filter 使用小经验
- Spring Cloud Eureka REST 接口
- Spring Cloud Eureka 控制台快速查看Swagger API文档
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mongoose 实现关联查询和踩坑记录
- UWP开发01之Windows UI2.x
- 前端模块化:CommonJS,AMD,CMD,ES6
- 那些年,我们追过的RPC
- 设计模式~装饰模式
- Linux共享库、静态库、动态库详解
- strace详解及实战
- 推荐一个比crontab更好用的东西:crongo
- Vue 自定义指令
- IDEA + Spring Boot 的三种热加载方案,看完弄懂,不用加班~
- 开篇讲--关于Kali的碎碎念
- Mysql服务器SQL模式 (官方精译)
- 如何用Prometheus和Grafana监控Kubernetes集群?
- linux实时文件事件监听--inotify
- MySQL事务原理&实战【官方精译】