一. 定义

适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

Adapter 模式的两种类别:类模式对象模式

二. 举例说明

实际中,我们为了完成某项工作购买了一个第三方的库来加快开发。这个库可能都是一些.dll文件,这就带来了一个问题!我们在应用程序中已经设计好
了接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类(不能在一起工作)可以在一起工作了,Adapter模式提供了将一个类(第三方库)
的接口转化为客户(购买使用者)希望的接口的方法。

三. 代码实现

类模式的Adapter采用继承的方式复用Adaptee的接口。

  1. //目标类,可以想像成客户所期代的接口
  2. class Target
  3. {
  4. public:
  5. Target()
  6. {
  7. }
  8. virtual ~Target()
  9. {
  10. }
  11. virtual void Request()
  12. {
  13. std::cout<<"Target::Request"<<std::endl;
  14. }
  15. };
  16. //被适应者,可以看成 dll 提供的接口
  17. class Adaptee
  18. {
  19. public:
  20. Adaptee()
  21. {
  22. }
  23. virtual ~Adaptee()
  24. {
  25. }
  26. void SpecificRequest()
  27. {
  28. std::cout<<"Adaptee::SpecificRequest"<<std::endl;
  29. }
  30. };
  31. //适配器类,通过在内部包装被适应者对象 adaptee
  32. //把源接口(SpecificRequest)转换成目标接口(Request)
  33. class Adapter: public Target, private Adaptee
  34. {
  35. public:
  36. void Request()
  37. {
  38. this->SpecificRequest();
  39. }
  40. };
  41. //测试代码
  42. int main(int argc,char* argv[])
  43. {
  44. Adaptee* ade = new Adaptee;
  45. Target* adt = new Adapter;
  46. adt->Request();
  47. return 0;
  48. }

对象模式的Adapter中则采用组合的方式实现Adaptee的复用。

  1. //目标类
  2. class Target
  3. {
  4. public:
  5. virtual ~Target() {}
  6. virtual void Request()
  7. {
  8. std::cout<<"Target::Request"<<std::endl;
  9. }
  10. };
  11. //被适应类
  12. class Adaptee
  13. {
  14. public:
  15. virtual ~Adaptee() {}
  16. void SpecificRequest()
  17. {
  18. std::cout<<"Adaptee::SpecificRequest"<<std::endl;
  19. }
  20. };
  21. //适配器类,用于转接两者的接口
  22. class Adapter:public Target
  23. {
  24. public:
  25. Adapter(Adaptee* ade)
  26. {
  27. this->_ade= ade;
  28. }
  29. void Request()
  30. {
  31. _ade->SpecificRequest();
  32. }
  33. private:
  34. Adaptee* _ade;
  35. };
  36. //测试代码
  37. int main(int argc,char* argv[])
  38. {
  39. Adaptee* ade = new Adaptee;
  40. Target* adt = new Adapter(ade);
  41. adt->Request();
  42. return 0;
  43. }

四. 说明

1. 当接口不同时,首先不应该考虑用适配器,而是应该考虑通过重构统一接口。

2. 使用适配器模式是无奈之举,通常在软件开发后期或维护期再考虑使用。

设计模式C++描述----06.适配器(Adapter)模式的更多相关文章

  1. 设计模式--适配器(Adapter)模式

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  2. Ruby设计模式透析之 —— 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  3. 【原】模式之-适配器Adapter模式

    适配器Adapter模式 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 模式所涉及的角色有 ...

  4. 2、适配器 adapter 模式 加个"适配器" 以便于复用 结构型设计模式

    1.什么是适配器模式? 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上. 如果想让额定工作电压是直流12伏特的笔记 ...

  5. java演示适配器(adapter)模式

    为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...

  6. 设计模式之(二)Adapter模式

    今天学习Adapter模式,An adapter helps two incompatible interfaces to work together. This is the real world ...

  7. Java 实现适配器(Adapter)模式

    平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的 ...

  8. 适配器(Adapter)模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的一些其他名称:变压器模式.转换器模式.包装(Wrapper)模式.适 ...

  9. 《图解设计模式》读书笔记1-2 Adapter模式

    目录 Adapter即适配器,可以类比为将220V的电压的电源转为5V电压的手机充电器,起转换的作用. 明确概念: Adaptee:被适配者,即220v电压的电源 Adapter:适配器,即手机充电器 ...

随机推荐

  1. Spring boot 梳理 - SpringBoot中注入ApplicationContext对象的三种方式

    直接注入(Autowired) @Configuration public class OAConfig { @Autowired private ApplicationContext applica ...

  2. 【ADO.NET基础-Login】带验证码验证的登录界面(用于简单的基础学习)

    以下代码如果有不对或者不妥之处,还望大神们指点一二 或者有同学者有问题或建议,一定要提出来,共同探讨 小弟在此感谢! 前台代码: <!DOCTYPE html> <html xmln ...

  3. One layer SoftMax Classifier, "Handwriting recognition"

        import lib needed¶ In [1]: from PIL import Image import numpy as np import matplotlib.pyplot as ...

  4. 『TensorFlow2.0正式版』TF2.0+Keras速成教程·零:开篇简介与环境准备

    此篇教程参考自TensorFlow 2.0 + Keras Crash Course,在原文的基础上进行了适当的总结与改编,以适应于国内开发者的理解与使用,水平有限,如果写的不对的地方欢迎大家评论指出 ...

  5. mysql创建用户和权限管理

    一 权限管理 我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作.包括select.update.delete.update.grant等操作.那么一般情况在公司之后DBA工程师会创建 ...

  6. Nginx+Tomcat Https SSL部署方案

    1.软件版本: nginx-1.15+ tomcat-8.0+ 2.先解决一个疑问:Tomcat到底需不需要配置SSL? 答案:不需要 3.SSL申请 使用腾讯云.阿里云的服务器,会更加方便申请.(申 ...

  7. Linux虚拟机中配置JDK环境变量(Ubuntu系统)

    首先通过Xshell中文件传输想你的虚拟机上传你的jdk,如图所示:(需要本机安装Xftp:链接: https://pan.baidu.com/s/1sWHmywZ2C6V2n4aa1FqqFg 提取 ...

  8. 解决window.onload延迟加载问题

    window.onload方法,表示当页面所有的元素都加载完毕,并且所有要请求的资源也加载完毕才触发执行function这个匿名函数里边的具体内容.这样肯定保证了代码在domReady之后执行.使用w ...

  9. SVM面试知识点总结

    1. SVM 原理 SVM 是一种二类分类模型.它的基本思想是在特征空间中寻找间隔最大的分离超平面使数据得到高效的二分类,具体来讲,有三种情况(不加核函数的话就是个线性模型,加了之后才会升级为一个非线 ...

  10. django渲染高阶

    08.16自我总结 django渲染高阶 一.利用母版渲染 1.创建母版文件 如:stamper.html <!DOCTYPE html> <html lang="en&q ...