转自:http://blog.csdn.net/lcl_data/article/details/8780140

解决的问题:

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。比如说我的hp笔记本,美国产品,人家美国的电压是110V的,而我们中国的电压是220V,要在中国能使用,必须找个变压器转一下电压才可以。这个变压器就是个适配器。

适配器模式有类适配器和对象适配器两种模式,我们将分别讨论。

类适配器

由图中可以看出,Adaptee类没有Request方法,而客户期待这个方法。为了使客户能够使用Adaptee类,提供一个中间环节,即类Adapter类,Adapter类实现了Target接口,并继承自Adaptee,Adapter类的Request方法重新封装了Adaptee的SpecificRequest方法,实现了适配的目的。

因为Adapter与Adaptee是继承的关系,所以这决定了这个适配器模式是类的。

该适配器模式所涉及的角色包括:

目标(Target)角色:这是客户所期待的接口。因为C#不支持多继承,所以Target必须是接口,不可以是类。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:把源接口转换成目标接口。这一角色必须是类

简单实现:

#include <iostream>
using namespace std;class Target
{
public:virtual void Request(){};
};class Adaptee
{
public:void SpecificRequest(){cout<<"Called SpecificRequest()"<<endl;}
};class Adapter_A : public Target, private Adaptee
{
public:virtual void Request(){this->SpecificRequest();}
};int main(int argc, char **argv)
{Target *t = new Adapter_A();t->Request();system("pause");return 0;
}

Adapter类应该采用公共方式继承Target类,并用私有方式继承Adaptee类。因此,Adapter类应该是Target的子类型,但不是Adaptee的子类型。

对象适配器:

从图中可以看出:客户端需要调用Request方法,而Adaptee没有该方法,为了使客户端能够使用Adaptee类,需要提供一个包装(Wrapper)类Adapter。这个包装类包装了一个Adaptee的实例,从而将客户端与Adaptee衔接起来。由于Adapter与Adaptee是委派关系,这决定了这个适配器模式是对象的。

该适配器模式所涉及的角色包括:

目标(Target)角色:这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
源(Adaptee)角色:需要适配的类。
适配器(Adapter)角色:通过在内部包装(Wrap)一个Adaptee对象,把源接口转换成目标接口。

简单实现

#include <iostream>
using namespace std;class Target
{
public:virtual void Request(){};
};class Adaptee
{
public:void SpecificRequest(){cout<<"Called SpecificRequest()"<<endl;}
};class Adapter_B : public Target
{
public:Adapter_B(Adaptee *pAdaptee){this->pAdaptee = pAdaptee;}virtual void Request(){pAdaptee->SpecificRequest();}
private:Adaptee *pAdaptee;
};int main(int argc, char **argv)
{Adaptee *pAdaptee = new Adaptee();Target *tt = new Adapter_B(pAdaptee);tt->Request();system("pause");return 0;
}

缺省适配器:

缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是“平庸”的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。

简单实现:

#include<iostream>
using namespace std;class Target {
public:virtual void f1(){}; virtual void f2(){}; virtual void f3(){};
};class DefaultAdapter : public Target
{
public:void f1() { } void f2() { } void f3() { }
};class MyInteresting :public DefaultAdapter
{
public:void f3(){       cout<<"呵呵,我就对f3()方法感兴趣,别的不管了!"<<endl;}
};int main()
{// Create adapter and place a requestTarget *t = new MyInteresting();t->f3();return 0;
}

实现要点:

1.Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。

2.Adapter模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。

3.Adapter模式的实现可以非常的灵活,不必拘泥于GOF23中定义的两种结构。例如,完全可以将Adapter模式中的“现存对象”作为新的接口方法参数,来达到适配的目的。

4.Adapter模式本身要求我们尽可能地使用“面向接口的编程”风格,这样才能在后期很方便的适配。

使用场景:

在以下各种情况下使用适配器模式:

1.系统需要使用现有的类,而此类的接口不符合系统的需要。

2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。

3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

4.1Adapter模式相关推荐

  1. 大淘宝服务端技术干货沉淀和总结

    网络基础 TCP三次握手 三次握手过程 客户端--发送带有SYN标志的数据包--服务端 一次握手 Client进入syn_sent状态 服务端--发送带有SYN/ACK标志的数据包--客户端 二次握手 ...

  2. python 各种模块学习

    from:https://blog.csdn.net/weiwangchao_/article/details/70570508 转载:.... Python的模块大全,很全,有详细介绍! 另外附Py ...

  3. java-IO流(5)-IO流中的设计模式(装饰器模式和适配器模式)的介绍

    目录 1装饰器模式 1.1定义 1.2代码实现 1.3装饰器特点 1.4装饰器在IO流中的使用 2配适器模式 2.1Adapter适配器 2.2代码实例 2.3适配器特点 2.4适配器优缺点 2.5适 ...

  4. 【Docker】容器的几种网络模式

    当你使用Docker时,你会发现需要了解很多关于网络的知识.Docker作为目前最火的轻量级容器引擎,因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求.本文介绍了Docker的4种 ...

  5. kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势

    陈显铭(山丘) 读完需要 6分钟 速读仅需 2 分钟 陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构.服务化.性能优化等有深入的理解.参与支付宝支付链路核心系统,设计.调优应用系统关键能力, 高效 ...

  6. 2022-2028年中国交通建设PPP模式深度分析及发展战略研究报告(全卷)

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了PPP模式行业相关概述.中国PPP模式行业运行环境.分析了中国PPP ...

  7. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)

    1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...

  8. 2022-2028年中国新型氟塑料行业市场发展模式及投资机会预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了新型氟塑料行业相关概述.中国新型氟塑料行业运行环境.分析了中国新型氟 ...

  9. RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)

    1. simple 模式 simple 模式是最简单最常用的模式 2. work 模式 work 模式有多个消费者 消息产生者将消息放入队列.生产者系统不需知道哪一个任务执行系统在空闲,直接将任务扔到 ...

最新文章

  1. 厦大AI研究院今日揭牌成立:数学系校友陈纯院士领衔
  2. 关于浮点数精度的问题
  3. AnularJS1事件
  4. 【27前端】base标签带有href属性会让chrome里的svg元素url失效
  5. php云服务器买什么系统吗,php云服务器买什么系统
  6. 《C#与.net高级编程》——第一支柱:C#的封装
  7. Python数据分析模块 | pandas做数据分析(二):常用预处理操作
  8. 12.swift 元祖
  9. Java Web学习总结(9)——servlet和Jsp生命周期解读
  10. 滑轮滚动到页面底部ajax加载数据的实例
  11. 路飞学城项目之加入购物车接口
  12. FISCO BCOS 智能合约 可视化数据库 Mysql MariaDB
  13. 动手设计 CPU(一)—— 各类元件功能表
  14. power-law 之Zipf
  15. dts无损音乐什么意思_QQ音乐,网易云,AppleMusic谁的音质好?
  16. 程序员的“我爱你”表达方式
  17. 电子原理 半波整流与桥式整流Protues仿真电路
  18. linux kde磁盘扫描,在KDE桌面中使用Krusader进行更好的文件管理 | MOS86
  19. Lumerical官方案例、FDTD时域有限差分法仿真学习(九)——布拉格光栅(Bragg gratings)
  20. 自学实前后端践项目3 Spring Cloud微服务 2

热门文章

  1. 白盒测试 Junit 单元测试
  2. 爬虫实战:百度失信人名单
  3. mySql触发器 trigger详解及实例
  4. 【求职】完美世界Java 方向面经
  5. 嵌入式芯片的硬件组成(ARM内核)
  6. centos7安装jdk11
  7. 伪静php,php实现伪静态
  8. style=text css,cssText-cssText 是什么,style.cssText 使用教程
  9. 佛教对计算机的影响,宣化上人:200年后计算机会消失
  10. Appium抓取app数据