1、意图

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

2、适用性

以下情况使用Adapter模式

(1)你想使用一个已经存在的类,而它的接口不符合你的需求

(2)你想创建一个可以复用的类,该类可以与其它不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作

(3)你想使用一些已经存在 的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可参适配它的父类接口,这种情况仅适用于对象Adapter

3、结构

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

类适配器使用多重继承对一个接口与另一个接口进行匹配。

对象适配器依赖于对象组合。

对象适配器的代码如下

#include <iostream>
#include <string>using namespace std;class Target
{
public:virtual string operation() = 0;
};class Adaptee
{
public:string method1() {return "Adapter";}string method2() {return " pattern";}
};class Adapter : public Target
{Adaptee &adaptee;
public:Adapter(Adaptee &a) : adaptee(a) {}string operation() {return adaptee.method1() + adaptee.method2();}
};void f(Target &t)
{cout << t.operation() << endl;
}int main()
{Adaptee adaptee;Adapter adapter(adaptee);f(adapter);return 0;
}

4、参与者

(1)Target:定义Client使用的与特定领域相关的接口

(2)Client:与符合Target接口的对象协同

(3)Adaptee:定义一个已经存在的接口,这个接口需要适配

(4)Adapter:对Adaptee的接口与Target接口进行适配

5、协作

Client在Adapter实例上调用一些操作。接着适配器调用Adaptee的操作实现这个请求。

6、效果

类适配器和对象适配器有不同的权衡。

类适配器原则

(1)用一个具体的Adapter类对Adaptee和Target进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。

(2)使得Adaqter可以重新定义Adaptee的部分行为,因为Adapter是Adaptee的一个子类

(3)仅仅引入了一个对象,并不需要额外的指针以间接得到adaptee.

对象适配器原则

(1)允许一个Adapter与多个Adaptee——即Adaptee本身以及它的所有子类同时工作。Adapter也可以一次给所有的Adaptee添加功能。

(2)使得重定义Adaptee的行为比较困难。这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。

7、相关模式

Bridge模式的结构与对象适配器类似,但是Bridge模式的出发点不同:Bridge目的是将接口部分与实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而Adapter则意味着改变一个书友对象的接口

Decorator模式增强了其他对象 的功能而同时不改变它的接口。因些Decorator对应用程序的透明性比适配器要好。结果是decorator支持递归组合,而纯粹使用适配器是不可能实现这一点的。

Proxy模式在不改变它的接口的条件下,为另一个对象定义了一个代理。

结构型模式之Adapter模式相关推荐

  1. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  2. Java设计模式之结构型:装饰器模式

    一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...

  3. 结构型设计模式之组合模式

    结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...

  4. 创建型、结构型、行为型模式(2)

    来源:http://blog.csdn.net/wulingmin21/article/details/6757111 创建型模式 Singleton模式解决的是实体对象个数的问题. 除了Single ...

  5. 创建型、结构型、行为型模式(1)

    来源:http://blog.csdn.net/wulingmin21/article/details/6753363 目的 创建型模式 Creational Pattern 结构型模式 Struct ...

  6. 设计模式(结构型)之享元模式(Flyweight Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  7. 设计模式——结构型之用桥梁模式(Bridge Pattern)将“抽象”与“实现”解耦(五)

    引言 相信对于现实生活中这样的情况都不陌生,比如说开关与它具体控制的电器,开关的类型多种多样,而电器也是千变万化,两者之间相对独立变化却又耦合在一起,再比如说奶茶店的奶茶,有不同规格大小.不同口味.不 ...

  8. java-设计模式(结构型)-【代理模式】

    1.代理模式(ProxyMode) 定义:外观模式是对类与类之间关系的描述,而代理模式是对原来的方法添加其他的操作. 代理有"网关"的含义,比如用户访问论坛,则要经过代理(网关)授 ...

  9. (结构型)12、组合模式(部分即整体)

    组合模式 组合模式在定义类的时候就算是组合了,几乎无处不在,组合模式可以组合单一对象,也可以组合不同对象 在设计模式的总则中有一句话:"少用继承,多用组合.聚合的方式实现解耦" 单 ...

最新文章

  1. 一文看懂Tomcat、Nginx和Apache的区别
  2. mysql当前用户user()与current_user()
  3. .NET Socket服务编程之-高效连接接入编
  4. Python获取同目录下json文件内容
  5. cross-env使用 1
  6. python 实现Hadoop的partitioner和二次排序
  7. orm框架有哪些_.net core 基于Dapper 的分库分表开源框架(coredata)
  8. 计算机二级vfp教程云盘,全国计算机等级考试二级VFP教程.doc
  9. 将字符串中的大写字母转换为小写字母
  10. java 三维旋转立方体_旋转立方体实现
  11. 无法设置光驱位硬盘启动,制作双硬盘双系统启动菜单
  12. ddos攻击网站原理,遭受ddos攻击该如何处理进行防御?
  13. 三百英雄服务器维护2020,【梦服】2020年12月3日【版本更新说明】
  14. java 实现金额大小写转换
  15. SAP案例教程FI财务后台配置
  16. 工业元宇宙三人行系列直播活动第五场在北京举办
  17. 安装软件时,“Windows Installer Coordinator”一直循环
  18. Centos7下搭建DMHS(源端oracle目的端达梦,另附目的端oracle)
  19. 就这样,我走完了程序员的前五年。一路风雨泥泞,前方阳光正好。
  20. HTML网页设计基础——图文混排

热门文章

  1. Spring Integration学习资料
  2. It Smells!不要让两个状态纠缠的类同时成为某个事件的观察者(一切都只是视图)...
  3. 关于未能映射路径问题
  4. QQ、MSN、skype的网页临时会话代码
  5. [缓存]迅雷(XUNLEI)的工作原理揭密
  6. 下列哪个不是目前python里的内置模块-不吹不擂,你想要的Python面试都在这里了【315+道题】...
  7. 会python可以从事什么工作-Python入门后,想要从事自由职业可以做哪方面工作?...
  8. python爬虫百科-python爬虫百科
  9. 学python心得体会1000字-Python学习心得体会总结,不要采坑
  10. python从入门到精通书-Python从入门到精通(资源汇总)