设计模式--适配器模式

来源:互联网 发布: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();}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 足球鞋买大了怎么办? 军靴穿着磨脚怎么办 军靴磨大脚趾怎么办 想开服装店没经验怎么办 我鼻子大怎么办啊 副局长不听局长的话怎么办 边防改制部局怎么办 毛中老师打人怎么办 老婆是个泼妇怎么办 一年级孩子学习不好怎么办 生活作息不规律怎么办 作息时间不规律怎么办 能醒不想起床怎么办 不想起床怎么办 神回复 孩子不起床上学怎么办 孕晚期起床困难怎么办 腰间盘疼痛起床困难怎么办 小学生做作业拖拉怎么办 被手机贷起诉怎么办 大人睡颠倒了怎么办 熬夜长斑了怎么办 ps遇到文件尾怎么办 pdf用ps打不开怎么办 ps安装不上怎么办 工作原因经常熬夜怎么办 熬夜皮肤暗黄怎么办 经常熬夜睡眠不好怎么办 经常熬夜皮肤不好怎么办 皮肤熬夜变暗黄怎么办 晚上上夜班白天睡不着怎么办 熬夜肾虚怎么办才能好 经常熬夜口气重怎么办 晚上睡不着白天起不来怎么办 晚上熬夜白天睡不着怎么办 在外打工孩子上学怎么办 婴儿脸干燥发红怎么办 宝宝脸上红点点怎么办 药流出血量少怎么办 药流喝药第一天发烧了怎么办 药流第一天量很少怎么办 小孩不想吃饭口臭怎么办