一. 定义

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

Adapter 模式的两种类别:类模式对象模式

二. 举例说明

实际中,我们为了完成某项工作购买了一个第三方的库来加快开发。这个库可能都是一些.dll文件,这就带来了一个问题!我们在应用程序中已经设计好
了接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类(不能在一起工作)可以在一起工作了,Adapter模式提供了将一个类(第三方库)
的接口转化为客户(购买使用者)希望的接口的方法。

三. 代码实现

类模式的Adapter采用继承的方式复用Adaptee的接口。

  1. //目标类,可以想像成客户所期代的接口
  2. class Target
  3. {
  4. public:
  5. Target()
  6. {
  7. }
  8. virtual ~Target()
  9. {
  10. }
  11. virtual void Request()
  12. {
  13. std::cout<<"Target::Request"<<std::endl;
  14. }
  15. };
  16. //被适应者,可以看成 dll 提供的接口
  17. class Adaptee
  18. {
  19. public:
  20. Adaptee()
  21. {
  22. }
  23. virtual ~Adaptee()
  24. {
  25. }
  26. void SpecificRequest()
  27. {
  28. std::cout<<"Adaptee::SpecificRequest"<<std::endl;
  29. }
  30. };
  31. //适配器类,通过在内部包装被适应者对象 adaptee
  32. //把源接口(SpecificRequest)转换成目标接口(Request)
  33. class Adapter: public Target, private Adaptee
  34. {
  35. public:
  36. void Request()
  37. {
  38. this->SpecificRequest();
  39. }
  40. };
  41. //测试代码
  42. int main(int argc,char* argv[])
  43. {
  44. Adaptee* ade = new Adaptee;
  45. Target* adt = new Adapter;
  46. adt->Request();
  47. return 0;
  48. }

对象模式的Adapter中则采用组合的方式实现Adaptee的复用。

  1. //目标类
  2. class Target
  3. {
  4. public:
  5. virtual ~Target() {}
  6. virtual void Request()
  7. {
  8. std::cout<<"Target::Request"<<std::endl;
  9. }
  10. };
  11. //被适应类
  12. class Adaptee
  13. {
  14. public:
  15. virtual ~Adaptee() {}
  16. void SpecificRequest()
  17. {
  18. std::cout<<"Adaptee::SpecificRequest"<<std::endl;
  19. }
  20. };
  21. //适配器类,用于转接两者的接口
  22. class Adapter:public Target
  23. {
  24. public:
  25. Adapter(Adaptee* ade)
  26. {
  27. this->_ade= ade;
  28. }
  29. void Request()
  30. {
  31. _ade->SpecificRequest();
  32. }
  33. private:
  34. Adaptee* _ade;
  35. };
  36. //测试代码
  37. int main(int argc,char* argv[])
  38. {
  39. Adaptee* ade = new Adaptee;
  40. Target* adt = new Adapter(ade);
  41. adt->Request();
  42. return 0;
  43. }

四. 说明

1. 当接口不同时,首先不应该考虑用适配器,而是应该考虑通过重构统一接口。

2. 使用适配器模式是无奈之举,通常在软件开发后期或维护期再考虑使用。

设计模式C++描述----06.适配器(Adapter)模式的更多相关文章

  1. 设计模式--适配器(Adapter)模式

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  2. Ruby设计模式透析之 —— 适配器(Adapter)

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/9400153 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  3. 【原】模式之-适配器Adapter模式

    适配器Adapter模式 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 模式所涉及的角色有 ...

  4. 2、适配器 adapter 模式 加个"适配器" 以便于复用 结构型设计模式

    1.什么是适配器模式? 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上. 如果想让额定工作电压是直流12伏特的笔记 ...

  5. java演示适配器(adapter)模式

    为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...

  6. 设计模式之(二)Adapter模式

    今天学习Adapter模式,An adapter helps two incompatible interfaces to work together. This is the real world ...

  7. Java 实现适配器(Adapter)模式

    平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的 ...

  8. 适配器(Adapter)模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的一些其他名称:变压器模式.转换器模式.包装(Wrapper)模式.适 ...

  9. 《图解设计模式》读书笔记1-2 Adapter模式

    目录 Adapter即适配器,可以类比为将220V的电压的电源转为5V电压的手机充电器,起转换的作用. 明确概念: Adaptee:被适配者,即220v电压的电源 Adapter:适配器,即手机充电器 ...

随机推荐

  1. java程序猿如何练习java版的易筋经?

    故事背景 电视剧<天龙八部>中,阿朱易容后进入少林寺偷走了<易筋经>,她一直想把这本书送给乔峰.耿直的乔峰觉得此书来历不正,不肯接受.几番波折,这本书最后落到聚贤庄庄主游坦之手 ...

  2. wordpress发送邮件

    首先在wordpress内添加SMTP协议的插件,我这里用的是WP Mail SMTP 配置如下 配置完成之后测试一下,一定要测试能否发邮件

  3. php无限级分类实战——评论及回复功能

    经常在各大论坛或新闻板块详情页面下边看到评论功能,当然不单单是直接发表评论内容那么简单,可以对别人的评论进行回复,别人又可以对你的回复再次评论或回复,如此反复,理论上可以说是没有休止,从技术角度分析很 ...

  4. python - json模块使用 / 快速入门

    json基本格式 """ json格式 -> [{}, {}]: [{ "name": "Bob", "gende ...

  5. Python 必备面试基础知识-3

    今天继续分享 Python 相关的面试题,你准备好了嘛! 网络编程篇 1. 简述 OSI 七层协议 是网络传输协议,人为的把网络传输的不同阶段划分成不同的层次. 七层划分为:应用层.表示层.会话层.传 ...

  6. Spring入门(十五):使用Spring JDBC操作数据库

    在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要. 在Spring中,操作数据库有很多种方法,我们 ...

  7. CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算?

    CSS 选择符有哪些? 1.id选择器(#id) 2.类选择器(.class) 3.标签选择器(div,h1,p) 4.相邻选择器(h1 + p) 5.子选择器(ul > li) 6.后代选择器 ...

  8. js完整

    jQuery jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行 ...

  9. java并发之CAS详解

    前言 在高并发的应用当中,最关键的问题就是对共享变量的安全访问,通常我们都是通过加锁的方式,比如说synchronized.Lock来保证原子性,或者在某些应用当中,用voliate来保证变量的可见性 ...

  10. HDU 1428漫步校园

    漫步校园 Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU校 ...