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

分为类适配器模式和对象适配器模式。

系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

想使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式。

比如购买的第三方开发组件,该组件接口与我们自己系统的接口不相同,或者由于某种原因无法直接调用该组件,可以考虑适配器。

UML图如下:

图1:类模式适配器

图2:对象模式适配器

代码如下:

Adapter.h

 1 #ifndef _ADAPTER_H_
 2 #define _ADAPTER_H_
 3
 4 //目标接口类,客户需要的接口
 5 class Target
 6 {
 7 public:
 8     Target();
 9     virtual ~Target();
10     virtual void Request();//定义标准接口
11 };
12
13 //需要适配的类
14 class Adaptee
15 {
16 public:
17     Adaptee();
18     ~Adaptee();
19     void SpecificRequest();
20 };
21
22 //类模式,适配器类,通过public继承获得接口继承的效果,通过private继承获得实现继承的效果
23 class Adapter:public Target,private Adaptee
24 {
25 public:
26     Adapter();
27     ~Adapter();
28     virtual void Request();//实现Target定义的Request接口
29 };
30
31 //对象模式,适配器类,继承Target类,采用组合的方式实现Adaptee的复用
32 class Adapter1:public Target
33 {
34 public:
35     Adapter1(Adaptee* adaptee);
36     Adapter1();
37     ~Adapter1();
38     virtual void Request();//实现Target定义的Request接口
39 private:
40     Adaptee* _adaptee;
41 };
42 #endif

Adapter.cpp

 1 #include "Adapter.h"
 2 #include <iostream>
 3
 4 using namespace std;
 5
 6 Target::Target()
 7 {}
 8
 9 Target::~Target()
10 {}
11
12 void Target::Request()
13 {
14     cout << "Target::Request()" << endl;
15 }
16
17 Adaptee::Adaptee()
18 {
19 }
20
21 Adaptee::~Adaptee()
22 {
23 }
24
25 void Adaptee::SpecificRequest()
26 {
27     cout << "Adaptee::SpecificRequest()" << endl;
28 }
29
30 //类模式的Adapter
31 Adapter::Adapter()
32 {
33 }
34
35 Adapter::~Adapter()
36 {
37 }
38
39 void Adapter::Request()
40 {
41     cout << "Adapter::Request()" << endl;
42     this->SpecificRequest();
43     cout << "----------------------------" <<endl;
44 }
45
46 //对象模式的Adapter
47 Adapter1::Adapter1():_adaptee(new Adaptee)
48 {
49 }
50
51 Adapter1::Adapter1(Adaptee* _adaptee)
52 {
53     this->_adaptee = _adaptee;
54 }
55
56 Adapter1::~Adapter1()
57 {
58 }
59
60 void Adapter1::Request()
61 {
62     cout << "Adapter1::Request()" << endl;
63     this->_adaptee->SpecificRequest();
64     cout << "----------------------------" <<endl;
65 }

main.cpp

 1 #include "Adapter.h"
 2
 3 int main()
 4 {
 5     //类模式Adapter
 6     Target* pTarget = new Adapter();
 7     pTarget->Request();
 8
 9     //对象模式Adapter1
10     Adaptee* ade = new Adaptee();
11     Target* pTarget1= new Adapter1(ade);
12     pTarget1->Request();
13
14     //对象模式Adapter2
15     Target* pTarget2 = new Adapter1();
16     pTarget2->Request();
17
18     return 0;
19 }

在Adapter模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统共接口)。在C++中的public继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过private继承获得实现继承的效果(private继承后,父类中的接口都变为private,当然只能是实现继承了。),通过纯抽象基类模拟接口继承的效果,但是在C++中pure virtual function也可以提供默认实现,因此这是不纯正的接口继承,但是在Java中我们可以interface来获得真正的接口继承了。

C++设计模式-Adapter适配器模式相关推荐

  1. [C# 设计模式] Adapter - 适配器模式(两种)

    Adapter - 适配器模式 序 现实生活中,我们常用到适配器. 你当前打开我这篇文章的笔记本电脑,电源的另一边不正连着一块适配器吗? 你平时想将三口插座插进二口插座里面,不也需要一个适配器吗? 整 ...

  2. 精读《设计模式 - Adapter 适配器模式》

    Adapter(适配器模式) Adapter(适配器模式)属于结构型模式,别名 wrapper,结构性模式关注的是如何组合类与对象,以获得更大的结构,我们平常工作大部分时间都在与这种设计模式打交道. ...

  3. 设计模式之适配器模式(Adapter)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. C#设计模式(7)——适配器模式(Adapter Pattern)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将"将现存的对象" ...

  5. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabcd 介绍 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本 ...

  6. 【设计模式】—— 适配器模式Adapter

    模式意图 如果已经有了一种类,而需要调用的接口却并不能通过这个类实现.因此,把这个现有的类,经过适配,转换成支持接口的类. 换句话说,就是把一种现有的接口编程另一种可用的接口. 模式结构 [类的适配器 ...

  7. 『设计模式』适配器模式(Adapter)

    23种设计模式+额外常用设计模式汇总 (持续更新) 适配器模式(Adapter) 适配器模式把一一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. ...

  8. 设计模式-Adapter模式

    目录 相关概念 对象适配器 类适配器 一个例子 总结 适配器模式(Adapter Pattern)是结构型模式.主要用来解决接口不兼容的问题,将一个类的接口变换成客户端所期待的另一种接口,从而使原本因 ...

  9. 跟JBPM学设计模式之适配器模式

    跟JBPM学设计模式之适配器模式 模式简介 适配器模式(Adapter),将一个类的接口转换成客户希望的另一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 说起适配器模式 ...

最新文章

  1. python3 判断list是否包含另一个list
  2. git仓库的简单使用
  3. Java操作HBase 2.0.5:创建表代码示例
  4. 关于如何将sublime的主题应用到webstorm上
  5. java 反射类成员_java 反射(二)类成员
  6. .net core精彩实例分享 -- 应用启动
  7. 解决ubuntu中zabbix 4.2图形显示乱码
  8. 19【推荐系统9】WideDeep和DeepCross模型
  9. Node.js 8有哪些重要功能和修复? 1
  10. CA SDK 使用简介
  11. linux spi flash id,SPI读flash的ID问题
  12. C语言获取本机IP地址
  13. 论文 PPT 画图导出 PDF 注意事项
  14. mysql客户端用什么 知乎_知乎面试记
  15. 快2023年了,一个初级前端开发要达到什么水平?
  16. java获取请求ip的方法
  17. [新人向]MySQL和Navicat下载、安装及使用详细教程
  18. C++ qsort的理解
  19. 服务器和普通电脑有什么区别?
  20. 如何使用BBP公式直接计算π的第n位

热门文章

  1. 泰克示波器查眼图_泰克示波器自带上位机软件功能介绍,了解一下
  2. 哈佛大学单细胞课程|笔记汇总 (三)
  3. 和在c语言,?和:在C语言中的详解
  4. 第4章 同余问题《信息学奥赛一本通 提高篇》
  5. 线性代数、概率 入门书籍推荐
  6. ext store 数据修改_extjs 之Ext.data.Store变更单行记录值【修改】
  7. 多元线性回归matlab代码_医学统计|多元线性回归分析
  8. 【ES6(2015)】Object对象
  9. requirejs整合art-template模板引擎
  10. MySQL笔记-InnoDB中Record Lock与Gap Lock