类写的不规范(应该屏蔽类的拷贝构造函数和运算符=)。少写点代码,缩短篇幅,重在理解。 实际中可不要这样做。

类比生活中的手机,pad等电源适配器。

简单来讲: 将原本  不匹配  的两者  变的匹配  并且  不影响  原有的逻辑结构

1、分类

  A、类适配器

  B、对象适配器

  C、接口适配器

2、具体

  A、类适配器 是通过继承(泛化)实现的。比如, 交流电220v转为5v

  1. // 交流电
  2. class ac220v
  3. {
  4. public:
  5. int get_output()
  6. {
  7. return 220;
  8. }
  9. };
  10.  
  11. // 直流5V
  12. class dc5v
  13. {
  14. public:
  15. virtual int get_dc_5v() = 0;
  16. };
  17.  
  18. class power_ada : public ac220v, public dc5v
  19. {
  20. public:
  21. int get_dc_5v()
  22. {
  23. int aaa = ac220v::get_output();
  24. return 5;
  25. }
  26. };
  27. // 调用
  28. void call_power_ada()
  29. {
  30. std::unique_ptr<dc5v> p5v(new power_ada);
  31. if (!p5v)
  32. cout << "\n\n 类适配器创建失败\n\n";
  33. else
  34. cout << p5v->get_dc_5v();
  35. }

  B、 对象适配器     器是通过组合来实现适配器功能的,即适配器拥有源角色的实例

  1. class data_operation
  2. {
  3. public:
  4. void set_password(const string str) { this->str_password = str; }
  5. string get_password() { return this->str_password; }
  6.  
  7. virtual string do_encrypt(const int key, const string str) = 0;
  8.  
  9. private:
  10. string str_password;
  11. };
  12.  
  13. class Caesar
  14. {
  15. public:
  16. string do_encrypt(const int key, const string str)
  17. {
  18. return string("12345678");
  19. }
  20. };
  21.  
  22. // 加密适配器类
  23. class CipherAdapter : public Caesar, public data_operation
  24. {
  25. public:
  26. string do_encrypt(const int key, const string str)
  27. {
  28. return Caesar::do_encrypt(key, str);
  29. }
  30. };
  31.  
  32. void call_object_ada()
  33. {
  34. std::unique_ptr<data_operation> pdp(new CipherAdapter);
  35. if (!pdp)
  36. {
  37. cout << "\n\n 创建密文适配器对象失败\n\n";
  38. return;
  39. }
  40.  
  41. pdp->set_password("ABC");
  42. string str = pdp->do_encrypt(1, string("123"));
  43. cout << "密文 = " << str.c_str();
  44. }

  C、接口适配器        , 类似pad的充电适配器一样,输出的总是恒定值, 比如,iPhone5s的手机充电线,原版充电线输出位5V。下面演示的是 输出5V,输入可以有多种的电压值的电源适配器。

  1. // 5V接口类
  2. class idc5v
  3. {
  4. public:
  5. virtual int output() = 0;
  6. };
  7.  
  8. // 电源接口类
  9. class ipower
  10. {
  11. public:
  12. virtual int output() = 0;
  13. };
  14.  
  15. // 220V 电源
  16. class ac220v : public ipower
  17. {
  18. public:
  19. int output() { return 220; }
  20. };
  21.  
  22. // 110v 电源
  23. class ac110v : public ipower
  24. {
  25. public:
  26. int output() { return 110; }
  27. };
  28.  
  29. // 完整的电源适配器
  30. class power_adapter : public idc5v
  31. {
  32. public:
  33. power_adapter( ac220v* pinstance) { this->_ipower = pinstance; }
  34. power_adapter( ac110v* pinstance) { this->_ipower = pinstance; }
  35.  
  36. virtual ~power_adapter()
  37. {
  38. if (nullptr != _ipower)
  39. {
  40. delete _ipower;
  41. _ipower = nullptr;
  42. }
  43. }
  44.  
  45. // 重写基类的函数
  46. int output()
  47. {
  48. int ret_val = 0;
  49.  
  50. if (nullptr == _ipower)
  51. cout << "\n\n\n 创建5v对象失败\n\n\n";
  52. else
  53. {
  54. ret_val = _ipower->output();
  55. // 省略达到5V的操作
  56. ret_val = 5;
  57. }
  58.  
  59. return ret_val;
  60. }
  61.  
  62. private:
  63. ipower *_ipower = nullptr;
  64. };
  65.  
  66. // 调用电源适配器类
  67. void call_interface_ada_demo()
  68. {
  69. ac220v* pac220 = nullptr;
  70. pac220 = new(std::nothrow) ac220v;
  71. if (nullptr == pac220)
  72. {
  73. cout << "\n\n\n 调用电源适配器: 创建220v对象失败\n\n\n";
  74. return;
  75. }
  76.  
  77. idc5v *pdc5v = new(std::nothrow) power_adapter(pac220);
  78.  
  79. if (nullptr == pdc5v)
  80. {
  81. cout << "\n\n\n 调用电源适配器: 创建220v的电源适配器出错 \n\n\n";
  82. }
  83. else
  84. {
  85. cout << "\n\n\n 调用电源适配器: 输出220v对应的适配结果:" << pdc5v->output();
  86. }
  87.  
  88. // 释放资源
  89. if (nullptr != pdc5v)
  90. {
  91. delete pdc5v;
  92. pdc5v = nullptr;
  93. }
  94. }

c++设计模式概述之适配器的更多相关文章

  1. java 28 - 1 设计模式 之 面向对象思想设计原则和模版设计模式概述

    在之前的java 23 中,了解过设计模式的单例模式和工厂模式.在这里,介绍下设计模式 面向对象思想设计原则 在实际的开发中,我们要想更深入的了解面向对象思想,就必须熟悉前人总结过的面向对象的思想的设 ...

  2. java设计模式概述

    java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模 ...

  3. 23种GoF设计模式概述

    23种GoF设计模式概述 在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解.后面的章节再进行详细介绍. 创建型模式 关注于怎么创建对象的 ...

  4. Java设计模式(一):设计模式概述、UML图、设计原则

    1 设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  5. 设计模式(一)----设计模式概述及UML图解析

    1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...

  6. OOAD-设计模式(二)之GRASP模式与GOF设计模式概述

    一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...

  7. PHP设计模式概述

    PHP设计模式概述 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. ...

  8. 设计模式学习心得<适配器 Adapter>

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接 ...

  9. 001-java 设计模式概述

    一.概述 思维导图 GoF(“四人帮”,又称Gang of Four,即Erich Gamma, Richard Helm, Ralph Johnson & John Vlissides) 1 ...

随机推荐

  1. 【Pathview web】通路映射可视化

    前言 pathview是一个通路可视化友好的R包,最主要的是它支持多组学数据映射(基因/蛋白-代谢).自己用过它的R包,后来发现有网页版的,果断介绍给学员.因为不常用,记录要点,以后温习备用. 目前w ...

  2. ggplot2 图例及分页参数

    图例: 1 theme(legend.title =element_blank()) 2 guides(fill = guide_legend(title = NULL)) # 去掉图例title 3 ...

  3. Redis的六种特性 场景

    Redis的六种特性 l Strings l Hashs l Lists l Sets l Sorted Sets l Pub/Sub Redis各特性的应用场景 Strings Strings 数据 ...

  4. java中接口可以继承接口

    今天阅读别人的代码才发现,接口是可以继承接口的 一个类只能extends一个父类,但可以implements多个接口. 一个接口则可以同时extends多个接口,却不能implements任何接口. ...

  5. Linux内存管理和寻址详解

    1.概念 内存管理模式 段式:内存分为了多段,每段都是连续的内存,不同的段对应不用的用途.每个段的大小都不是统一的,会导致内存碎片和内存交换效率低的问题. 页式:内存划分为多个内存页进行管理,如在 L ...

  6. 学习java 7.26

    学习内容: 进度条是图形界面中广浅个较大的文件时,操作系统会显示一个进度条,用于标识复制操作完成的比例:当启动Eclipse等程序时,因为需要加载较多的资源,故而启动速度较慢,程序也会在启动过程中显示 ...

  7. Spark(二)【sc.textfile的分区策略源码分析】

    sparkcontext.textFile()返回的是HadoopRDD! 关于HadoopRDD的官方介绍,使用的是旧版的hadoop api ctrl+F12搜索 HadoopRDD的getPar ...

  8. 初学js正则表达式之密码强度验证

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Linux基础命令---sendmail发送邮件

    sendmail sendmail是postfix中的一个发送邮件的代理程序,它负责发送邮件到远程服务器,并且可以接收邮件.sendmail在发送邮件的时候,默认从标砖输入读取内容,以".& ...

  10. Docker常用image

    MySQL Start a mysql server instance Starting a MySQL instance is simple: docker run -itd --name mysq ...