软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》(DP)两本书。本文介绍适配器模式的实现。

DP上的定义:适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。它包括类适配器和对象适配器,本文针对的是对象适配器。举个例子,在STL中就用到了适配器模式。STL实现了一种数据结构,称为双端队列(deque),支持前后两段的插入与删除。STL实现栈和队列时,没有从头开始定义它们,而是直接使用双端队列实现的。这里双端队列就扮演了适配器的角色。队列用到了它的后端插入,前端删除。而栈用到了它的后端插入,后端删除。假设栈和队列都是一种顺序容器,有两种操作:压入和弹出。下面给出相应的UML图,与DP上的图差不多。

根据上面的UML图,很容易给出实现。

[cpp] view plaincopyprint?
  1. //双端队列
  2. class Deque
  3. {
  4. public:
  5. void push_back(int x) { cout<<"Deque push_back"<<endl; }
  6. void push_front(int x) { cout<<"Deque push_front"<<endl; }
  7. void pop_back() { cout<<"Deque pop_back"<<endl; }
  8. void pop_front() { cout<<"Deque pop_front"<<endl; }
  9. };
  10. //顺序容器
  11. class Sequence
  12. {
  13. public:
  14. virtual void push(int x) = 0;
  15. virtual void pop() = 0;
  16. };
  17. //栈
  18. class Stack: public Sequence
  19. {
  20. public:
  21. void push(int x) { deque.push_back(x); }
  22. void pop() { deque.pop_back(); }
  23. private:
  24. Deque deque; //双端队列
  25. };
  26. //队列
  27. class Queue: public Sequence
  28. {
  29. public:
  30. void push(int x) { deque.push_back(x); }
  31. void pop() { deque.pop_front(); }
  32. private:
  33. Deque deque; //双端队列
  34. };

使用方式如下:

[cpp] view plaincopyprint?
  1. int main()
  2. {
  3. Sequence *s1 = new Stack();
  4. Sequence *s2 = new Queue();
  5. s1->push(1); s1->pop();
  6. s2->push(1); s2->pop();
  7. delete s1; delete s2;
  8. return 0;
  9. }

本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985

设计模式C++实现(6)——适配器模式相关推荐

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

    设计模式(三)–适配器模式 文章目录 设计模式(三)--适配器模式 其他链接 1. 适配器模式 1.1 介绍 1.2 类适配器 1.3对象适配器 1.4 对比 其他链接 JVM学习笔记(一) JVM学 ...

  2. 老王讲设计模式(八)——适配器模式

    适配器模式,是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 公司的发展速度很快,一不小心,就收购了一个创业团队去做细分市场.这么一个改变,对于公司来说 ...

  3. 设计模式(七)——适配器模式

    设计模式(七)--适配器模式 概述 类适配器模式 对象适配器模式 应用场景 概述 我们在给手机充电的时候,一般会有一个数据线和充电头,然后插在插排上.我们是没有办法将数据线直接插在插排上的,所以我们需 ...

  4. JAVA设计模式——第 8 章 适配器模式【Adapter Pattern】(转)

    好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛.今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电 ...

  5. c语言 适配器模式例子,NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】...

    NodeJS设计模式总结[单例模式,适配器模式,装饰模式,观察者模式] 发布时间:2020-08-21 03:08:03 来源:脚本之家 阅读:117 作者:lucky芬 本文实例讲述了NodeJS设 ...

  6. 设计模式(五)适配器模式Adapter(结构型)

    设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库 ...

  7. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  8. 设计模式系列6:适配器模式(Adapter Pattern)

    定义 将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.    --<设计模式>GoF UML类图 使用场景 在遗留代码复用,类 ...

  9. 设计模式(七)适配器模式(Adapter Pattern)

    一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将"将现存的对象" ...

  10. 设计模式笔记六:适配器模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出(本文基本照搬,因为比较简单) 适配器模式(Adapter Pattern)是作为两个不兼 ...

最新文章

  1. SAP QM 激活01检验类型的前提下无Vendor CoA则不允许收货过账
  2. npm包管理机制引质疑:又一安装程序中发现恶意代码,开发者账户频遭劫持
  3. 密码找回功能可能存在的问题
  4. 【MM模块】Subcontracting 委外加工(外包)—2
  5. 【测试点0分析】1009 Product of Polynomials (25 分)
  6. mysql查询大于0的标记_MySQL如何查询回答数大于0的问题并分页
  7. CLR via C# 阅读 笔记
  8. 如何用ACM简化你的Spring Cloud微服务环境配置管理
  9. 数据科学和人工智能技术笔记 六、日期时间预处理
  10. android markdown 框架,Android Studio MarkDown风格README的正确打开姿势
  11. Matlab 马尔可夫链预测双色球
  12. 全国软考中级软件设计师 学习笔记-数据流图部分
  13. EEPROM、FLASH、NOR FLASH、NAND FLASH 区别、关系总结
  14. Echert 缩放后切换再数据,缩放大小没还原的解决办法
  15. python 读写pcd
  16. 胶囊网络之 Found a Reason for me? Weakly-supervised Grounded Visual Question Answering using Capsules论文笔记
  17. 论如何使用Python进行微信公众号的开发
  18. 素数回文(打表到文件里面)
  19. 网络层协议介绍与概述
  20. 【Java进阶营】阿里架构师手把手教你如何简单快捷地构建Spring应用

热门文章

  1. fputc会覆盖吗_蔬菜覆盖地膜有什么好处?选择什么膜好?
  2. 1040. 有几个PAT(25
  3. 【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具
  4. 【C++深度剖析教程24】C++中不同的继承方式
  5. Java排查问题随笔
  6. BZOJ4293 Siano
  7. Linux服务部署之NTP时间服务器
  8. 项目管理中风险评价的必要性
  9. CSS-posiziton
  10. JavaScript原生对象及扩展