Adapter模式主要意图是将类或接口转换成客户期望的接口,从而使得原本不兼容、无法在一起工作的接口可以在一起工作。该模式有两种形式的Adapter法,一是继承方式;二是对象关联依赖方式。

继承方式Adapter法,相比之下,耦合性更强些,并且毕竟依赖于静态继承,如果被适配的对象有多个(派生)版本的话,则在运行时,将无法做到动态适配,因此,如果想要切换适配对象,就必需要重新编译链接。该方式的类关系参考如下:

就Adapter的目的来说,Adapter对象在使用目的上与被适配的Adaptee对象本质上是没有什么关系的,因此可以说Adapter对象并不是一个Adaptee对象,Adapter对象仅仅只是需要Adaptee对象的相关功能而已(可以直观理解为:借个道,从你这路过而已)。继承方式的Adapter的编码结构参考如下:

 namespace adapter
{
class Target
{
public:
virtual void doSomething() {};
// some code here........(like virtual destructor etc.) };//class Target class Adaptee
{
public:
void doSpecifyWork() { /* some code here........ */ } };//class Adaptee class Adapter : public Target
, private Adaptee
{
public:
virtual void doSomething() override { Adaptee::doSpecifyWork(); } }//class Adapter }//namespace adapter

类继承式的Adapter编码结构参考

前面已述继承式的Adapter相对灵活性不强,而且最重要的问题是耦合性变强了,只要被适配对象有变动就需要重新编译链接。对象关联依赖方式相比继承方式更为灵活,并且可以在运行时对于同一系列的Adaptee进行动态适配。就设计而言,我们总是希望优先使用组合方式而非继承。因此,对于Adapter,建议优先考虑关联依赖式。类关系图参考如下:

模式编码结构参考如下:

 namespace adapter
{
class Target
{
public:
virtual void doSomething() {};
// some code here........(like virtual destructor etc.) };//class Target class Adaptee
{
public:
void doSpecifyWork() { /* some code here........ */ } };//class Adaptee class Adapter : public Target
{
public:
virtual void doSomething() override {
auto pAdaptee = this->getAdaptee();
if (nullptr != pAdaptee) {
pAdaptee->doSpecifyWork();
}
// some code here........
}
// some code here........ private:
Adaptee* getAdaptee() { return m_pAdaptee; } private:
Adaptee* m_pAdaptee; }//class Adapter }//namespace adapter

关联依赖式Adapter编码结构参考

实际上,Adapter可以提高代码的复用性,可以让多个互不相干的功能模块协同工作。但是Adapter时的难易程度与必要性,有时候也是需要斟酌的。如:待适配的以象极期复杂,而且与期望的对象相似度极低,此时,Adapter就比较蛋碎,肯定会花费不少时间与功夫,此时就需要进一步考虑是否真的有这个必要去适配。即:我们在动手前,需要先分析下Adapter的代价。这个算是一个注意点吧。

【结构型】Adapter模式的更多相关文章

  1. JAVA设计模式(09):结构型-代理模式(Proxy)

    代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...

  2. 结构型--代理模式(Proxy)

    一.代理模式是什么? 代理模式属于GOF23设计模式中结构型中的设计模式,通过代理对象来屏蔽(部分或者屏蔽)对真实对象的直接访问,下图为UML图: 在代理模式中组件包括:抽象角色接口.代理角色类.真实 ...

  3. 结构型---组合模式(Composite Pattern)

    组合模式的定义 组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合. 组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口 ...

  4. 结构型---外观模式(Facade Pattern)

    定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通 ...

  5. 结构型---桥接模式(Bridge Pattern)

    定义 桥接模式即将抽象部分与实现部分脱耦,使它们可以独立变化.桥接模式的目的就是使两者分离,根据面向对象的封装变化的原则,我们可以把实现部分的变化封装到另外一个类中,这样的一个思路也就是桥接模式的实现 ...

  6. 结构型---代理模式(Proxy Pattern)

    代理模式的详细介绍 代理模式按照使用目的可以分为以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象.这个不同的地址空间可以是本电脑中,也可以在另一台电脑中.最典型 ...

  7. 设计模式之美:Structural Patterns(结构型模式)

    结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...

  8. C#设计模式之十三代理模式(Proxy)【结构型】

    一.引言   今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字 ...

  9. C#设计模式之十二代理模式(Proxy Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...

  10. 结构型模式(七) 代理模式(Proxy)

    一.动机(Motivate) 在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦.如何在不 ...

随机推荐

  1. 【HDOJ】4857 逃生

    很容易想到优先队列+拓扑排序.关键点是有限制条件者有限,无限制条件者在最后,条件相同者按序输出.因此采用逆序. #include <iostream> #include <queue ...

  2. 【转】第 02 天:在 Windows 平台必裝的三套 Git 工具

    原文网址:https://github.com/doggy8088/Learn-Git-in-30-days/blob/master/docs/02%20%E5%9C%A8%20Windows%20% ...

  3. GCC使用

    GCC的选项 如何指定GCC的默认头 文件路径 Linux系统的头文件 和库文件搜索路径 头文件 库文件 运行时动态库的搜索路径 GCC的选项 -c 只生成目标文件(.o),不连接. % gcc -c ...

  4. bzoj 1056 [HAOI2008]排名系统(1862 [Zjoi2006]GameZ游戏排名系统)

    1056: [HAOI2008]排名系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 502[Submit][Statu ...

  5. java笔记14之private

    private:        1 是一个权限修饰符        2 可以修饰成员变量和成员方法        被其修饰的成员只能在本类中被访问 class Demo { //int num = 1 ...

  6. python_Opencv_使用Matplotlib模块

    使用Matplotlib模块 Matplotib 是python 的一个绘图库,里头有各种各样的绘图方法. 之后会陆续了解.先学习怎样用Matplotib 显示图像. 可以放大图像,保存图像. 安装M ...

  7. mac上安装redis

    1.从http://redis.io 下载redis包,这里选择了redis-3.2.3 2.将下载的 redis-3.2.3.tar.gz 包拷贝到 /user/local 目录 3.执行 sudo ...

  8. SpringMVC 之文件上传 MultipartResolver

    基于前面文章的基础上. 一.准备 需要的jar  二.配置 1.  spmvc-servlet.xml <?xml version="1.0" encoding=" ...

  9. NGUI 动态字体边缘模糊,毛边的问题解决办法

    NGUI支持生成动态字体,将ttf格式的字体文件拖入工程,用NGUIFontMaker制作即可,但是制作完之后会发现字体有毛边,边缘模糊. 这时选中你生成的字体预设,在该预设的UIFont脚本上更改P ...

  10. 你需要知道的九大排序算法【Python实现】之插入排序

    三.插入排序 基本思想:插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算 ...