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 }

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

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

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

  2. C++设计模式-Adapter适配器模式

    Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...

  3. 一天一个设计模式——Adapter适配器模式(Wrapper模式)

    一.模式说明 在现实生活中,当需要将两种设备连接起来,但是两个设备的接口规范又不一致(比如电脑上只有Type-C接口,但是你的显示器是HDMI接口),这时候就需要一个适配器,适配器一端连接电脑,一端连 ...

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

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

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

    原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...

  6. C#设计模式之七适配器模式(Adapter)【结构型】

    一.引言   从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...

  7. 8.3 GOF设计模式二: 适配器模式 Adapter

    GOF设计模式二: 适配器模式 Adapter  为中国市场生产的电器,到了美国,需要有一个转接器才能使用墙上的插座,这个转接 器的功能.原理?复习单实例模式  SingleTon的三个关键点  ...

  8. C#设计模式之六适配器模式(Adapter Pattern)【结构型】

    一.引言 从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题,那[ ...

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

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

随机推荐

  1. 管道过滤器模式(Pipe and Filter)与组合模式(修改)

    转自:http://haolloyin.blog.51cto.com/1177454/348277 之前在 benjielin 前辈的博客中看到“管道过滤器(Pipe-And-Filter)模式(ht ...

  2. android 自定义View onMeasure中 super.onMeasure 和 setMeasuredDimension

    练习写一个自定义的view,代码是抄网上的,第一次写,没有问题,与网上的示例一样的效果, 第二次.第三次,都出现问题,但是解决了. 昨天进行第四次写再写,又出问题不一样的问题了. 首先是想加一个子包, ...

  3. 学习游戏渲染(Shader)的用处

     本文在讨论的主题并不限于具体引擎或具体语言,为了说明方便可能会提到Unity的一些内容. 最近渐渐发现很多从事游戏开发的新人,对于学会写Shader似乎总是有几分神往,但一般入了门或者学了一段时间后 ...

  4. 尚学堂Spring视频教程(二):Spring控制反转

    用Spring来实现IOC 在上节中我们自定义了一个接口BeanFactory和类ClassPathXmlApplicationContext来模拟Spring,其实它们在Spring中确实是存在的, ...

  5. mac-文本编辑器

    windows时代最喜欢的文本编辑器一直是ultraedit,但到了mac下,破解的ultraedit退出时会异常,于是琢磨着换编辑器,最终选择了sublime text2,百度下载,不注册也可以用. ...

  6. Android开发-mac上使用三星S3做真机调试

    之前一直未使用真机进行Android开发,为准备明天的培训,拿出淘汰下来的s3准备环境,竟然发现无法连接mac,度娘一番找到答案,如下:mac 系统开发android,真机调试解决方案(无数的坑之后吐 ...

  7. 如何查看屏幕touch driver是否在正常工作

    1. adb shell cat proc/bus/input/devices查看touch对应的是哪个event,如是event3: 2. adb shell getevent dev/input/ ...

  8. 慕课网-Java入门第一季-7-5 Java 中带参无返回值方法的使用

    public class HelloWorld { public static void main(String[] args) { // 创建对象,对象名为hello HelloWorld hell ...

  9. 使用wcf服务捕捉到“POST http://yourIP/WCFService.svc 405 (Method Not Allowed) ”错误!

    在程序中使用了一个wcf服务,调试时无任何问题(win7 64位,iis6.1),发布到部门服务器上没有问题(server2008 64位),但是部署到实际服务器上时(server2008 iis6. ...

  10. jquery下常用正则表达式整理(可直接粘贴使用)

    与正则表达式做比较的方法 var _val = '1234'; var _ev = /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z] ...