在软件开发过程中,有时候系统的数据和行为都正确,但接口不符合,这时候我们就应该考虑使用适配器模式,适配器的作用即将一个类的接口转换成客户希望的另外一个接口。它使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。它分为类适配器模式和对象适配器模式。

UML图:

类模式适配器

适配器Adapter继承自Target和Adaptee类,Adapter类需要重写Target类的Request函数,在Request中做适当的处理,调用Adaptee类的SepcificRequest。最终,Target实际调用的是Adaptee的SpecificRequest来完成Request的,完成适配,这就是类适配器。

对象模式适配器

适配器Adapter类继承自Target类,同时,在Adapter类中有一个Adaptee类型的成员变量。Adapter类重写Request函数时,在Request中,使用Adaptee类型的成员变量调用Adaptee的SpecificRequest函数,最终完成适配,这就是对象适配器。

举个例子:在开发一个模块的时候,有一个功能点实现起来比较费劲,但是,之前有一个项目的模块实现了一样的功能点;但是现在这个模块的接口和之前的那个模块的接口是不一致的。此时,作为项目开发人员的你,该怎么办?当然是在中间加一层Wrapper了,也就是使用适配器模式,将之前实现的功能点适配进新的项目了。

代码实现:

Adapter.h

#ifndef _ADAPTER_H_#define _ADAPTER_H_//目标接口类,客户需要的接口class Target{public:Target();virtual ~Target();virtual void Request();//定义标准接口};//需要适配的类class Adaptee{public:Adaptee();~Adaptee();void SpecificRequest();};//类模式,适配器类,通过public继承获得接口继承的效果,通过private继承获得实现继承的效果class Adapter :public Target, private Adaptee{public:Adapter();~Adapter();virtual void Request();//实现Target定义的Request接口};//对象模式,适配器类,继承Target类,采用组合的方式实现Adaptee的复用class Adapter1 :public Target{public:Adapter1(Adaptee* adaptee);Adapter1();~Adapter1();virtual void Request();//实现Target定义的Request接口private:Adaptee* _adaptee;};#endif

Adapter.cpp

#include "Adapter.h"#include using namespace std;Target::Target() {}Target::~Target() {}void Target::Request() {cout << "Target::Request()" << endl;}Adaptee::Adaptee() {}Adaptee::~Adaptee() {}void Adaptee::SpecificRequest() {cout << "Adaptee::SpecificRequest()" << endl;}//类模式的AdapterAdapter::Adapter() {}Adapter::~Adapter() {}void Adapter::Request() {cout << "Adapter::Request()" << endl;this->SpecificRequest();cout << "----------------------------" << endl;}//对象模式的AdapterAdapter1::Adapter1() :_adaptee(new Adaptee) {}Adapter1::Adapter1(Adaptee* _adaptee) {this->_adaptee = _adaptee;}Adapter1::~Adapter1() {}void Adapter1::Request(){cout << "Adapter1::Request()" << endl;this->_adaptee->SpecificRequest();cout << "----------------------------" << endl;}

main.cpp

#include "Adapter.h"int main(){//类模式AdapterTarget* pTarget = new Adapter();pTarget->Request();//对象模式Adapter1Adaptee* ade = new Adaptee();Target* pTarget1 = new Adapter1(ade);pTarget1->Request();//对象模式Adapter2Target* pTarget2 = new Adapter1();pTarget2->Request();return 0;}

运行结果:

Adapter::Request()Adaptee::SpecificRequest()----------------------------Adapter1::Request()Adaptee::SpecificRequest()----------------------------Adapter1::Request()Adaptee::SpecificRequest()----------------------------

在Adapter模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现。简单的说接口继承就是派生类只继承函数的接口,也就是声明。实现继承就是派生类同时继承函数的接口和实现。

在C++中的public继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过private继承获得实现继承的效果(private继承后,父类中的接口都变为private,当然只能是实现继承了。),通过纯抽象基类模拟接口继承的效果,但是在C++中纯虚函数也可以提供默认实现,因此这是不纯正的接口继承,但是在Java中我们可以interface来获得真正的接口继承了。

如何定义适配器adapter类_设计模式22-Adapter(适配器)模式-组件接口适配相关推荐

  1. java 工厂模式的写法_设计模式-Java-简单工厂模式--BitmapFactory

    上一篇,我们说了下MonkeyLei:设计模式-Java-观察者模式-RxJava 其中还利用到了反射的知识,另外也附上了很多我觉得分析还可以的链接. 这里我们看看简单工厂这块.除了这个还有其他几个: ...

  2. 策略设计模式_设计模式之策略者模式

    策略者模式简介 策略者模式定义一个算法接口,并由其实现类去实现,使得每一个算法都得到封装,并让他们可以相互替换.这是一种行为型模式.策略者模式降低了算法行为和环境角色的耦合度,使得算法可以独立发生变化 ...

  3. 组合模式_设计模式结构性:组合模式(CompositePattern)

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  4. 创建型模式、结构型模式和行为型模式_设计模式之创建型模式

    设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...

  5. java设计与模式_设计模式《JAVA与模式》之状态模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述状态(State)模式的: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为 ...

  6. mysql工厂模式_设计模式-三种工厂模式实例

    1.简单工厂模式:代替new产生对象,产品的类型比较少时. 我们要获得三种不同的数据库对象,如Mysql,SQLserver,Oracle,它们拥有共同的特征,即可以进行抽象,简单工厂目的是将获得具体 ...

  7. vb6.0 定义一个公共类_纠正网上的错误:能不能自定义一个类叫java.lang.System/String?...

    前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考. 作者:一汪清水  来源:https://dwz.cn/i7Pf6VwZ 最近,学习了下java类加载相关的知识.然后看到网上有一道面试题 ...

  8. python定义一个student类_从零开始学Python-Day38-类和实例

    原标题:从零开始学Python-Day38-类和实例 面向对象编程中最重要的概念就是类(Class)和实例(Instance),其中"类"是抽象的模板,"实例" ...

  9. python定义一个triangle类_设计一个程序,程序中有三个类,Triangle,Lader,Circle。...

    //此程序写出三个类,triangle,lader,circle:其中triangle类具有类型为double的a,b,c边以及周长,面积属性, //具有周长,面积以及修改三边的功能,还有判断能否构成 ...

最新文章

  1. “北京今年入冬的第一场雪”,纪念博客园写日志一年了
  2. mysql where后面if_mysql查询语句where后面加if判断
  3. windows phone 8.0 app 移植到windows10 app 页面类
  4. 为什么我们批评C++?又爱又恨的垃圾回收机制
  5. JavaScript 专题之如何判断两个对象相等
  6. CIKM 2021 | Google出品:将对比学习用于解决推荐系统长尾问题
  7. 录像带转存电脑的方法_误删微信记录别着急,教你几招可靠的恢复微信记录方法...
  8. Angular Universal 学习笔记 - 客户端渲染和服务器端渲染的区别
  9. Taro+react开发(51) 数组对象和数组得处理
  10. codeforces problem 768B
  11. Android学习笔记(九)——Activity的跳转和数据传递
  12. ADO.NET Command对象简介
  13. 最流行的 .NET 反编译工具合集
  14. 系统设计.如何设计一个秒杀系统(完整版)
  15. 前后端分离实现excel批量导入导出功能
  16. 怎么看台式计算机是几位的,电脑多少位在哪里看_如何看电脑系统是多少位-win7之家...
  17. 浅谈外存分配的几种方式
  18. 【已解决】ubuntu无法进入启动页面,全屏出现【ok】并且不停闪烁
  19. Amazon软件开发工程师面试题
  20. 分享个自己Python爬虫时的浏览器标识库

热门文章

  1. Romoting 通信DEMO(整理)
  2. 关于字符匹配所引起的的问题
  3. 移动端点击a链接出现蓝色背景问题解决
  4. windows环境:dos 通过ftp连接到vsftpd 显示乱码解决方法
  5. 解决OpenCV JavaCameraView相机preview方向问题
  6. 德勤发布2021中国成长型AI企业研究报告:迈向巅峰之路
  7. 【干货】2020年研发运营安全白皮书.pdf(附下载链接)
  8. windows下anaconda环境激活报错CommandNotFoundError: Your shell has not been properly configured to use ‘con
  9. 【广告技术】用张量分解预测广告库存,广告投放更可靠!
  10. 学完java后学python_大火的python开发学好后能找到工作吗