C++设计模式之适配器模式(Adapter)
适配器模式顾名思义在于接口的转换,最形象的例子就如两口转三口电源适配器,口子的数量可以理解为参数数量,一如我们调用三个参数的接口,而提供的接口只有两个参数,那么久需要适配器类进行接口的扩展改造,这就是适配器模式存在的最主要意义。
作用
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作,使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式。
类视图
类模式适配器
对象模式适配器
代码实现
//目标接口类,客户需要的接口 class Target { public: Target(){} virtual ~Target(){} virtual void Request()//定义新的标准接口 { cout << "Request" << endl; } }; //需要适配的类 class Object { public: Object(){} ~Object(){} void SpecificRequest() { cout << "SpecificRequest" << endl; } }; //类模式,适配器类,通过public继承获得接口继承的效果,通过private继承获得实现继承的效果 class Adapter :public Target, private Object { public: Adapter(){} ~Adapter(){} virtual void Request()//实现Target定义的Request接口 { cout << "AdapterRequest" << endl; this->SpecificRequest(); cout << "----------------------------" << endl; } }; //对象模式,适配器类,继承Target类,采用组合的方式实现Object的复用 class Adapter1 :public Target { public: Adapter1(Object* adaptee) :_adaptee(adaptee) {} Adapter1() :_adaptee(new Object) {} ~Adapter1(){} virtual void Request()//实现Target定义的Request接口 { cout << "Adapter1Request" << endl; _adaptee->SpecificRequest(); cout << "----------------------------" << endl; } private: Object* _adaptee; }; //client调用 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; }
在Adapter模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统共接口)。在C++中的public继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过private继承获得实现继承的效果(private继承后,父类中的接口都变为private,当然只能是实现继承了。),通过纯抽象基类模拟接口继承的效果,但是在C++中pure virtual function也可以提供默认实现,因此这是不纯正的接口继承,但是在Java中我们可以interface来获得真正的接口继承了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10深入理解C++中常见的关键字含义
- 01-10使用C++实现全排列算法的方法详解
- 01-10APUE笔记之:进程环境详解
- 01-10c++中inline的用法分析
- 01-10用C++实现DBSCAN聚类算法
- 01-10全排列算法的非递归实现与递归实现的方法(C++)
- 01-10C++大数模板(推荐)
- 01-10浅谈C/C++中的static与extern关键字的使用详解
- 01-10深入C/C++浮点数在内存中的存储方式详解
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11ajax实现页面的局部加载
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10C#中split用法实例总结
- 04-02jquery与jsp,用jquery
- 01-10delphi制作wav文件的方法
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10SublimeText编译C开发环境设置