设计模式--适配器模式
来源:互联网 发布:nginx 转发真实ip 编辑:程序博客网 时间:2024/05/30 04:50
适配器模式的定
适配器模式:将一个类的接口转换成客户希望的另外一个接口,适配器模式使原本由于接口不兼容而不能一起工作的类一起工作。
适配器模式的类图
Client:调用客户端
Target:目标抽象接口
Adapter:实际调用接口的实现
Adaptee:需要适配的接口
适配器试用范围
想使用已经的类,但如果它的接口,也就是它的方法和你的要求不同时,就应该考虑用适配器模式。
用例分析
公司领导一拍脑门,想做一个电脑病毒扫描工具。工程师接收到分析,结合多年被软件经理反复更改需求挖坑的经验,决定给病毒引擎类添加一个统一的接口,引擎的接口包含初始化、扫描、显示扫描结果等方法,并且所有工程师或者项目组实现的引擎接口类必须继承该接口,最后实现的代码如下:
#ifndef IANTIVIRUS_H_ #define IANTIVIRUS_H_ class IAntiVirus{ public: virtual void initial() = 0; virtual void scan() = 0; virtual void show() = 0;};#endif /* IANTIVIRUS_H_ */
#include"IAntiVirus.h"#ifndef MYANTIVIRUS_H_#define MYANTIVIRUS_H_class MyAntiVirus : public IAntiVirus{public: void initial(); void scan(); void show();};#endif /* MYANTIVIRUS_H_ */
#include<iostream>#include"MyAntiVirus.h"using namespace std;void MyAntiVirus::initial(){ cout<<"initialize virus engine"<<endl;}void MyAntiVirus::scan(){ cout<<"scan the computer"<<endl;}void MyAntiVirus::show(){ cout<<"the computer environment is ok"<<endl;}
#include<iostream>#include"IAntivirus.h"#include"MyAntiVirus.h"#include"TencentAntiVirusAdapter.h"using namespace std;int main(){ IAntiVirus* antiVirus = new MyAntiVirus(); antiVirus->initial(); antiVirus->scan(); antiVirus->show(); antiVirus = new TencentAntiVirusAdapter(); antiVirus->initial(); antiVirus->scan(); antiVirus->show(); return 0;}
工程验收之后,各方面指标达到预期要求,软件经理表示很满意,并夸奖我司工程师写代码很靠谱。
一段时间之后,公司杀毒软件上市,但是经过三个月的推广运营,不少用户反馈公司开发的杀毒引擎过于简单,很多功能不如友商的竞品好用,所以一直没有什么人气。但是公司研发人力有限,想要短时间完全自力更生研发出市面上数一数二的引擎不太现实,好在项目经理经过一番运作,和国内大厂商Tencent勾搭上,经过谈判Tencent愿意将该司引擎TencentAntiVirus.class已合作方式免费给公司使用。有了大公司的杀毒引擎,项目经理一拍脑袋,对用户承诺一个星期之后,公司最新研发高级杀毒软件将会面世,丝毫没有考虑坐在发布会一边不停地MMP的骂声---
仔细阅读Tencent方面发过来的引擎使用说明书之后,很多工程师表示要重构代码,好在一个知道适配器模式的工程师提出,可以用适配器模式将Tencent提供的接口做一次封装,在不改变原有架构的前提下,增加一个适配器类即可实现对Tencent引擎的兼容,又一次成功跳过产品经理送给他的坑,该程序员运用适配器模式增加的代码如下:
#include"IAntiVirus.h"#include"TencentAntiVirus.h"#ifndef TENCENTANTIVIRUSADAPTER_H_#define TENCENTANTIVIRUSADAPTER_H_class TencentAntiVirusAdapter : public IAntiVirus{public:void initial();void scan();void show();private:TencentAntiVirus* antiVirus;};#endif /* TENCENTANTIVIRUS_H_ */
#include<iostream>#include"TencentAntiVirus.h"#include"TencentAntiVirusAdapter.h"using namespace std;void TencentAntiVirusAdapter::initial(){ antiVirus = new TencentAntiVirus(); antiVirus->initialTencent();}void TencentAntiVirusAdapter::scan(){ antiVirus->scanTencent();}void TencentAntiVirusAdapter::show(){ antiVirus->showTencent();}
- 设计模式:适配器模式
- 设计模式------适配器模式
- 设计模式:适配器模式
- 设计模式---适配器模式
- 设计模式 适配器模式
- 设计模式 - 适配器模式
- 设计模式--适配器模式
- 设计模式-适配器模式
- 设计模式------适配器模式
- 设计模式---适配器模式
- 设计模式- 适配器模式
- 设计模式 - 适配器模式
- 设计模式:适配器模式
- 适配器模式--设计模式
- 设计模式 - 适配器模式
- 设计模式-适配器模式
- 设计模式---适配器模式
- 设计模式-适配器模式
- springMVC上传文件
- Mysqli实现的注册登录后台代码
- 图像识别与处理之Opencv——识别直线与圆形(对应棋盘棋子)11月1日暂存
- 《集体智慧编中文版》读书笔记——第三章:发现群组
- 60. Permutation Sequence
- 设计模式--适配器模式
- 次短路
- 从零基础认识ssm
- 如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion
- The Summary of Yanyan's Blog
- 洛谷题解
- Oracle之分区和优化总结
- Python高级可视化库seaborn回归分析(基础整理)
- UVA11426 FZU1969 51NOD1188 线性欧拉筛法+筛法