设计模式七:Adapter(适配器)——类对象结构型模式
结构型模式:
结构型模式设计到如何组织类和对象以获得更大的结构。
结构型类模式:
采用继承机制来组合接口或实现。简单的例子是采用多重继承,这一模式尤其有助于多个独立开发的类库协同工作。
结构型对象模式:
不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法,因为可以在运行时刻改变对象组合关系,所以有更大的灵活性。
Adapter(适配器)——类对象结构型模式
1.意图
将一个类的结构转换成客户希望的另外一个接口。adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。
2.别名
包装器wrapper
3.动机
有时候,为了复用而设计的工具想不能够被复用的原因仅仅是因为他的接口与专业应用领域所需要的接口不匹配。
4.适用性
你想使用一个已经存在的类,而他的接口不符合你的要求
你想创建一个可以复用的类,该类可以与其他不相关的类或者不可预见的类协同工作
(仅适用于对象adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配他的父类接口
5.结构
类适配器
对象适配器
参考:http://www.cnblogs.com/zhxiang/archive/2012/01/14/2322565.html
6.参与者
target
定义client使用的与特定领域相关的接口
client
与符合target接口的对象协同
adaptee
定义一个已经存在的接口,这个接口需要适配
adapter
对adaptee的接口与target接口进行适配
7.协同
client在adapter实例上调用一些操作,接着适配器调用adaptee的操作实现这个请求
8.效果
类适配器和对象适配器有不同的权衡
类适配器:
1)用一个具体的adapter类对adaptee和target进行匹配。但是当我们想要匹配一个类以及所有他的子类时,类adapter就不能胜任工作
2)使得adapter可以重新定义adaptee的部分行为,因为adapter是adaptee的一个子类
3)仅仅引入了一个对象,并不需要额外的指针以简洁得到了adaptee
对象适配器:
1)允许一个adaper与多个adaptee即adaptee及其所有子类,可以一次对其所有子类添加功能
2)使重定义adaptee的行为比较困难。
需要考虑的其他因素
1)adapter的匹配程度
adapter的工作量取决于target接口与adapter接口的相似程度
2)可插入的adapter
当其他类使用一个类时,如果所需的假定条件越少,这个类就更具有可复用性。如果将接口匹配构建为一个类,就不需要假定对其他的类的可见的是一个相同的接口。
3)使用双向匹配器以提供透明操作
被适配的对象不再兼容adaptee的接口,因此不是所有adaptee的对象都可以被使用的地方它都可以被使用。
9.实现
1)使用c++实现适配器类时,应该用公有方式继承target类,用私有方式继承adaptee类。
2)可插入的适配器
首先要为adaptee找到一个窄接口,即可用于适配的最小操作集。
然后有三种实现方式:使用抽象操作、使用代理对象、参数化的适配器
10.代码实现
类适配器:
#include<iostream> using namespace std;class target {public:target(){cout<<"target generated"<<endl;}virtual void request(){cout<<"target request"<<endl;} };class adaptee {public:adaptee(){cout<<"adaptee generated"<<endl;}void specifiedRequest(){cout<<"adaptee specifiedRequest"<<endl;} };class adapter:public target, private adaptee {public:adapter(){cout<<"adapter generated"<<endl;}void request(){adaptee::specifiedRequest();} };int main() {target *t = new adapter;t->request();return 0; }
对象适配器
#include<iostream> using namespace std;class target {public:target(){cout<<"target generated"<<endl;}virtual void request(){cout<<"target request"<<endl;} };class adaptee {public:adaptee(){cout<<"adaptee generated"<<endl;}void specifiedRequest(){cout<<"adaptee specifiedRequest"<<endl;} };class adapter:public target {public:adapter(){cout<<"adapter generated"<<endl;}void request(){ad.specifiedRequest();}private:adaptee ad; };int main() {target *t = new adapter;t->request();return 0; }
11.相关模式
bridge模式的结构与对象适配器类似,但是出发点不同,其目的是将接口部分和实现部分分离,从而对他们可以较为容易也相对独立的加以改变。
而adapter则意味着改变一个已有对象的接口。
decorator模式增强了其他对象的功能而同时又不改变他的接口。因此其对程序的透明性比适配器好,可以进行递归组合,而适配器不行。
模式proxy在不改变他的接口的条件下,为另一个对象定义了一个代理
转载于:https://www.cnblogs.com/w0w0/archive/2012/05/19/2508697.html
设计模式七:Adapter(适配器)——类对象结构型模式相关推荐
- Adapter(适配器)--类对象结构型模式
Adapter(适配器)–类对象结构型模式 一.意图 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本接口不兼容而不能一起工作的那些类可以一起工作. 二.动机 1.在软件系统中, ...
- 设计模式十三:proxy(代理)——对象结构型模式
proxy(代理)--对象结构型模式 1.意图 为其他对象提供一种代理以控制这个对象的访问 2.动机 对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化. 3.适 ...
- Decorator(装饰)--对象结构型模式
Decorator(装饰)–对象结构型模式 一.意图 1.动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 二.动机 1.在某些情况下我们可能会&quo ...
- Proxy(代理)--对象结构型模式
Proxy(代理)–对象结构型模式 一.意图 为其他对象提供一种代理以控制对这个对象的访问. 二.动机 1.在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或 ...
- Facade(外观)--对象结构型模式
Facade(外观)–对象结构型模式 一.意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 二.动机 1.上述左边方案的问题在于组 ...
- Composite(组合)--对象结构型模式
Composite(组合)–对象结构型模式 一.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 二.动机 ...
- Flyweight(享元)--对象结构型模式
Flyweight(享元)–对象结构型模式 一.意图 运行共享技术有效地支持大量细粒度的对象. 二.动机 1.在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行 ...
- Java设计模式学习总结(7)——结构型模式之适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能.这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口 ...
- Java设计模式学习总结(14)——结构型模式之代理模式
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式.在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 介绍 意图:为其他对象提供一 ...
最新文章
- PHP新手上路(六)
- VMware备份研究
- leetcode 563. 二叉树的坡度(Java版)
- 《Programming WPF》翻译 第9章 3.自定义功能
- 华为认证双IE网络工程师,花了三天时间整理的OSPF详解,建议收藏
- 【HTML/JS】百度地图javascriptAPI点击地图得到坐标(拾取坐标) 标签: 百度地图坐标
- 浅淡风月 一些有意思的文章
- Android 状态栏适配
- 选择婚庆公司的注意事项
- nod-1089-最长回文子串 V2
- OSChina 周五乱弹 ——下完雨朕的江山都湿了
- [转] 最火的42部美剧,练听力的不二之选
- 黑苹果NVIDIA显卡驱动程序【 WebDriver-387.10.10.10.40.131+支持macOS 10.13.6 High Sierra (17G8037)版本】
- vue 图片转base64格式的方法
- 三中新教学楼信息系统集成方案
- 【Dart 教程系列第 21 篇】Dart 之 firstWhere 返回数组中第一个满足条件的元素
- 公务员考试——申论1
- mate20 全网通 激活设备 卡刷包 修复过程
- 我,机械工程硕士,工作一年,月入6K
- 乐视账号服务器关闭,乐视手机恢复出厂设置之后服务异常怎么办_无法登录乐视帐号解决办法_智能家...
热门文章
- vue全局引入openlayers_vue项目中openlayers绘制行政区划
- layui checkbox加th;全选 反选
- linux判断网站被采集,网站被采集的几个处理方法(非技术)
- java如何关闭线程池_如何优雅的关闭Java线程池
- slf4j + log4j2配置日志引擎
- python中pep8规范_Python PEP8规范
- android下载图片服务,Android中的背景图片下载需要帮助吗?
- 氩焊机器人编程_焊接机器人编程及调试方法
- 彻底搞懂oracle字符集,搞懂oracle字符集
- 基于matlab 的图像重建,基于Matlab的2D-FFT图像重建软件的设计