适配器模式及C++实现
适配器模式及C++实现
适配器模式
适配器模式是很好理解的模式了,生活中也非常常见,什么插头2口转3口,什么USB转PS2,这都算是适配器模式。说白了,就是如果有一些东西提供的接口你很像用,但是你手头没有好的接口使用它,这个就需要一个适配器,将你需要的接口转换成你所拥有的接口。这样的好处也是显而易见,就是你不用改变你现在所拥有的接口,保证你在任何地方的用法都不需要修改,然后底层的实现由适配器调用需要的接口来具体实现。
常见的场景
使用第三方库的时候,第三方的库肯定不能适用所有的系统,所以需要一个适配器来转换。
优点
1.屏蔽了具体的实现方式,实现了依赖倒转。
2.可以把不统一的接口封装起来,使之成为统一的接口。
3.把本来不方便适用的接口转换成统一的接口。
缺点
C++实现

1 #ifndef _ADAPTER_H_
2 #define _ADAPTER_H_
3
4 #include "Adaptee.h"
5
6
7 class Target
8 {
9 public:
10 Target();
11 virtual ~Target();
12
13 virtual void request() = 0;
14 };
15
16
17 class Adapter: public Target
18 {
19 public:
20 Adapter();
21 ~Adapter();
22
23 void request();
24
25
26 private:
27 Adaptee* adaptee;
28 };
29
30
31 #endif


1 #include "Adapter.h"
2
3
4 Target::Target()
5 {
6
7 }
8
9
10 Target::~Target()
11 {
12
13 }
14
15
16 Adapter::Adapter():
17 adaptee(new Adaptee())
18 {
19
20 }
21
22
23 Adapter::~Adapter()
24 {
25
26 }
27
28
29 void Adapter::request()
30 {
31 adaptee->specificRequest();
32 }


1 #ifndef _ADAPTEE_H_
2 #define _ADAPTEE_H_
3
4 class Adaptee
5 {
6 public:
7 Adaptee();
8 ~Adaptee();
9
10 void specificRequest();
11
12 };
13
14
15 #endif


1 #include "Adaptee.h"
2 #include <stdio.h>
3
4
5 Adaptee::Adaptee()
6 {
7
8 }
9
10
11 Adaptee::~Adaptee()
12 {
13
14 }
15
16
17 void Adaptee::specificRequest()
18 {
19 fprintf(stderr, "this is specificRequest\n");
20 }


1 #include "Adapter.h"
2
3
4 int main()
5 {
6 Target* tar = new Adapter();
7 tar->request();
8 return 0;
9 }

1 g++ -o client client.cpp Adapter.cpp Adaptee.cpp
运行结果
适配器模式及C++实现的更多相关文章
- PHP设计模式(七)适配器模式(Adapter For PHP)
适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 如下图(借图): // 设置书的接口 // 书接口 interface BookI ...
- 《JS设计模式笔记》 5,适配器模式
//适配器模式的作用就像一个转接口. jQuery("#"+id); $id=function (id) { return jQuery("#"+id)[0]; ...
- 设计模式(七): 通过转接头来观察"适配器模式"(Adapter Pattern)
在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern).适配器模式用处还是比较多的,如果你对“适配器模式”理解呢,那么自 ...
- 设计模式(七)适配器模式(Adapter Pattern)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- PHP 适配器模式
适配器模式(Adapter)模式:将一个类的接口,转换成客户期望的另一个类的接口.适配器让原本接口不兼容的类可以合作无间. [适配器模式中主要角色]目标(Target)角色:定义客户端使用的与 ...
- 每天一个设计模式-3 适配器模式(Adapteer)
每天一个设计模式-3 适配器模式(Adapteer) 1.现实中的情况 旧式电脑的硬盘是串口的,直接与硬盘连接,新硬盘是并口的,显然新硬盘不能直接连在电脑上,于是就有了转接线.好了,今天的学习主题出来 ...
- 设计模式--适配器模式Adapter(结构型)
一.适配器模式 适配器模式的主要作用是在新接口和老接口之间进行适配.将一个类的接口转换成客户端期望的另外一个接口.其实适配器模式有点无赖之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该通过重 ...
- c#设计模式-适配器模式
一. 适配器(Adapter)模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. 名称由来 这很像变压器(Adapter),变压 ...
- C#设计模式系列:适配器模式(Adapter)
在实际的软件系统设计和开发中,为了完成某项工作需要购买一个第三方的库来加快开发.这带来一个问题,在应用程序中已经设计好的功能接口,与这个第三方提供的接口不一致.为了使得这些接口不兼容的类可以在一起工作 ...
- Net设计模式实例之适配器模式(Adapter Pattern)
一.适配器模式简介(Brief Introduction) 适配器模式,将一个类装换成客户期望的另外一个接口.Adapter模式使的原本由于接口不兼容而不能工作的那些类可以一起工作. 二.解决的问题( ...
随机推荐
- windows下exfat无法写入修复
为了可以实现mac与windows文件共享,把移动硬盘格式化为exfat了,但是在osx中放入文件后,在windows上紧进行读取写入时出现错误,提示使用chkdsk进行修正,以下是修正步骤. ①wi ...
- Notepad++ 配置 支持jquery、html、css、javascript、php代码提示
原文:Notepad++ 配置 支持jquery.html.css.javascript.php代码提示 官网下载:http://notepad-plus-plus.org/ 获取插件的方法:打开软件 ...
- 注意,WebDeploy服务会占用80端口。(Windows关闭了IIS,80端口任然被占用)
最近遇到一个很奇怪的事情,Windows上的 IIS 网站 全关掉了,80端口仍然被占用.然后我新装了一台服务器,一个一个组件地装,装一个测一次,最后发现,WebDeploy这个组件,会占用80端口. ...
- Pythonic论坛怪怪的’居民’显示[已解决]
之前使用Pythonic搭建的论坛people界面显示有点问题 第一个用户不显示,问了下作者,作者回复说这个Link只有~/people/而没有用户名 就点到为止了. 按说我使用syncdb同步时注册 ...
- Linux下查看使用频率最高的十个命令
这个shell是在linux吧一个小伙伴发的,链接已找不到,挺有意思的,隔段时间运行一次,可以看看自己最近都干了什么. [shell] history | awk '{CMD[$2]++;count+ ...
- ZA7783:MIPI转LVDS/MIPI转RGB888/RGB转LVDS
在消费类电子越来越白热化阶段.好多设计project师已经開始慢慢关注到成本控制,小金在这里就给大家带来一颗转接IC.希望能帮助贵公司控制成本.当然性能也是可靠的,已经好多产品设计了. 多多不吝赐教 ...
- Mysql高级之触发器
原文:Mysql高级之触发器 触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete). 看以下事件: 完 ...
- SQL Server 2008 允许远程链接,适用于广域网和局域网
用户在使用SQL Server 2008远程链接时,可能会弹出如下对话框: 在链接SQL服务器时发生网络链接错误或特定实例错误.SQL服务器不存在或者链接不成功.请验证用户名是否正确或SQL服务器是否 ...
- java中实现与.net的format格式化字符串输出
Java中的格式化字符串 System.out.println(MessageFormat.format("name={0}", "张三")); .net中的格 ...
- JS函数实现金额小写转大写
///<summery>小写金额转化大写金额</summery> function AmountLtoU(amount) { if (isNaN(amount) || amou ...