设计模式C++实现(6)——适配器模式

 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】dcmtk程序包综述(1)!!!!!!

转自&#xff1a;https://blog.csdn.net/shenziheng1/article/details/70053152 1.前言 本文对dcmtk程序包做了简单介绍&#xff0c;包括主要接口类的简单说明&#xff0c;可用的工具以及一些例子。下一步工作准备详细分析每个程序包中的接口类功能&#xff0c;并结合源码和d…

edusoho linux 500错误,EduSoho网校系统如何处理500 Internal Server Error? - EduSoho官网

500 代表着服务器处理异常&#xff0c;因此需要找出服务报的异常。如何找出异常&#xff1f;根据框架提供的机制&#xff0c;只需要在web/app.php中将开发模式打开&#xff0c;就可以看到具体异常。$kernel new AppKernel(prod, false);改成$kernel new AppKernel(prod, true…

SQL大全

--语 句              功 能 --数据操作 SELECT   --从数据库表中检索数据行和列 INSERT   --向数据库表添加新数据行 DELETE   --从数据库表中删除数据行 UPDATE   --更新数据库表中的数据 --数据定义 CREATE TABLE  --创建一个数据库表 …

设计模式C++实现(7)——装饰模式

装饰模式&#xff1a;动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机&#xff0c;允许你为手机添加特性&#xff0c;比如增加挂件、屏幕贴膜等。一种灵活的设…

【转】dcmtk程序包综述(2)!!!!!

转自&#xff1a;https://shenchunxu.blog.csdn.net/article/details/70054161 有删改 1.dcmnet程序包 dcmnet是一个网络库及可用工具。 该模块包含了实现DICOM网络通信的所有函数集&#xff0c;即&#xff1a;DICOM上层有限状态机(DICOM Upper Layer Finite State Machine)&…

较为周全的Asp.net提交验证方案 (下)

接上篇。 下面要对这个生成的“提交验证”类进行功能扩展&#xff0c;通过.Net的“部分类”或“扩展方法”技术都可以轻松实现&#xff0c;这里采用的是“部分类”技术&#xff1a; 引用生成的ADO.NET Entity Framework数据模型的命名空间&#xff0c;且声明为部分类。 书写静态…

linux 14.04安装方法,Ubuntu 14.04 安装配置GNOME经典界面

Ubuntu 14.04上基本完美支持GNOME经典界面&#xff0c;安装配置步骤如下&#xff1a;1. 安装gnome-session-flashbacksudo apt-get install gnome-session-flashback这个包安装后&#xff0c;注销后&#xff0c;在登录界面就能选择GNOME Flashback (Compiz)这个桌面环境了。2. …

设计模式C++实现 —— 策略模式

策略模式是指定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样&#xff0c;对外的接口一样&#xff0c;只是各自实现上存在差异。用策略模式来封装算法&#…

【转】DIB位图(Bitmap)的读取和保存

转自&#xff1a;https://www.cnblogs.com/wangguchangqing/p/5417444.html 设备无关位图&#xff08;Device Independent Bitmap&#xff09;是可以保存在磁盘的位图文件&#xff0c;可以从磁盘读取到内存或者从内存保存到磁盘上。它的文件结构是标准化的&#xff0c;可以在W…

16进制字符串转化为10进制数

同学在MSN CDC电话面试&#xff08;可惜我在被面试的时候全然没有这么具体的问题了&#xff1a;&#xff09;&#xff09;中的一个题目&#xff1a;将16进制的字符串转化为10进制数字&#xff0c;例如“1A”&#xff0c;则对应26。题目很简单&#xff0c;实现起来也容易&#x…

arch linux 入门,arch linux 从来就不是给新手入门用的

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼在学生的时候&#xff0c;常会有些科目议题难&#xff0c;大部分的人死命地猛读&#xff0c;却也考得低分&#xff1b;也是会有够聪明又考的高分的人&#xff0c;轻描淡写地说&#xff1a;没时间读&#xff0c;随便看一下&#xff…

【转】DCMTK各模块说明!!!!!!!

转自&#xff1a;https://blog.csdn.net/Kelvin_Yan/article/details/50765693 有删改 原文来自wiki DCMTK&#xff1a;http://support.dcmtk.org/redmine/projects/dcmtk/wiki/modules 各模块说明 These are the modules of the public DCMTK toolkit (version 3.6.0): 关…

IT农民工如何来美国工作

经历一年多的等待与折腾&#xff0c;终于来美国工作了。自打进入IT这一行那天起&#xff0c;就梦想着有一天能在硅谷的顶尖的IT公司上班&#xff0c;没想到梦想就这么成真了。当然&#xff0c;我的梦想不算远大。但是我觉得人的梦想是随着成长一点一点变大的。伟人们的远大理想…

【转】DICOM医学图像处理:基于DCMTK工具包学习和分析worklist

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/38775315 背景&#xff1a; DICOM3.0协议中有介绍关于worklist的部分。简而言之&#xff0c;worklist可以看做是放射科设备从医院RIS系统中自动读取患者信息的一种“通信协议”&#xff0c;可以指存储在RIS系…

libc.so.6linux查找,Linux中提示:/lib64/libc.so.6: version `GLIBC_2.17' not found 的解决办法...

昨天在服务器上安装好node之后&#xff0c;提示这个错误&#xff1a;./node: /lib64/libc.so.6: version GLIBC_2.17 not found (required by ./node)&#xff0c;今天把解决过程整理一下一、查看系统中可使用的glibc版本//使用strings命令查看strings /lib64/libc.so.6 |grep …

linux将汇编转为机器码,汇编语言 高级语言 机器语言 本地代码

不管是什么语言&#xff0c;最终都会转化为机器语言(本地代码)(机器码)&#xff0c;计算机程序的运行最终仍是以机器语言(本地代码)(机器码)运行的。java汇编语言&#xff1a;linux汇编语言是低级编程语言&#xff0c;不像高级语言有跨平台性&#xff0c;首先&#xff0c;CPU的…

【转】关于DCMTK中像素存储以及getoutdata()函数的使用

转自&#xff1a;https://blog.csdn.net/ancewer/article/details/73277895 有删改 当你看这个帖子的时候&#xff0c;假设你也因为这个问题而感到困惑。 在使用这个函数的时候纠结了很久&#xff0c;各种google、百度都没查到相关资料&#xff0c;测试了好多次&#xff0c;并…

【Visual C++】游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论

看到在留言中很多朋友提到不太清楚DirectX与游戏引擎的区别的问题&#xff0c;在这里浅墨就专门把自己对游戏引擎的一些理解写成一篇文章&#xff0c;作为我们《Visual C游戏开发》专栏的游戏引擎导论&#xff0c;也希望能通过这篇文章&#xff0c;能让大家有所启发&#xff0c…

String ... String 三个点 jdk1.5的特性.才知道

String ... String 三个点 jdk1.5的特性.才知道 String... excludeProperty表示不定参数&#xff0c;也就是调用这个方法的时候这里可以传入多个String对象。public static void main(String[] args) {//测试&#xff0c;传入多个参数test("hello", "world"…

c语言大数相加oj,郑州轻工业大学oj题解(c语言)论如何正确的提高正确率:水题合集(四)...

好像离上一篇水题篇过去已经快半个月了~也是好久没有发过这些简单又有趣的题目了呢&#xff0c;今天想起来就总结几道吧。今天是看龙族的一天~ 花了一下午时间把《龙族2》看了2/3&#xff0c;看书的时间真的过的飞快&#xff0c;听着歌翻着书&#xff0c;一会4.5个小时就过去了…