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

装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。下面给出装饰模式的UML图。

        在这种设计中,手机的装饰功能被独立出来,可以单独发展,进而简化了具体手机类的设计。下面给出Phone类的实现:

[cpp] view plaincopyprint?
  1. //公共抽象类  
  2. class Phone  
  3. {  
  4. public:  
  5.     Phone() {}  
  6.     virtual ~Phone() {}  
  7.     virtual void ShowDecorate() {}  
  8. };  

        具体的手机类的定义:

[cpp] view plaincopyprint?
  1. //具体的手机类  
  2. class iPhone : public Phone  
  3. {  
  4. private:  
  5.     string m_name; //手机名称  
  6. public:  
  7.     iPhone(string name): m_name(name){}  
  8.     ~iPhone() {}  
  9.     void ShowDecorate() { cout<<m_name<<"的装饰"<<endl;}  
  10. };  
  11. //具体的手机类  
  12. class NokiaPhone : public Phone  
  13. {  
  14. private:  
  15.     string m_name;  
  16. public:  
  17.     NokiaPhone(string name): m_name(name){}  
  18.     ~NokiaPhone() {}  
  19.     void ShowDecorate() { cout<<m_name<<"的装饰"<<endl;}  
  20. };  

        装饰类的实现:

[cpp] view plaincopyprint?
  1. //装饰类  
  2. class DecoratorPhone : public Phone  
  3. {  
  4. private:  
  5.     Phone *m_phone;  //要装饰的手机  
  6. public:  
  7.     DecoratorPhone(Phone *phone): m_phone(phone) {}  
  8.     virtual void ShowDecorate() { m_phone->ShowDecorate(); }  
  9. };  
  10. //具体的装饰类  
  11. class DecoratorPhoneA : public DecoratorPhone  
  12. {  
  13. public:  
  14.     DecoratorPhoneA(Phone *phone) : DecoratorPhone(phone) {}  
  15.     void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }  
  16. private:  
  17.     void AddDecorate() { cout<<"增加挂件"<<endl; } //增加的装饰  
  18. };  
  19. //具体的装饰类  
  20. class DecoratorPhoneB : public DecoratorPhone  
  21. {  
  22. public:  
  23.     DecoratorPhoneB(Phone *phone) : DecoratorPhone(phone) {}  
  24.     void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }  
  25. private:  
  26.     void AddDecorate() { cout<<"屏幕贴膜"<<endl; } //增加的装饰  
  27. };  

         客户使用方式:

[cpp] view plaincopyprint?
  1. int main()  
  2. {  
  3.     Phone *iphone = new NokiaPhone("6300");  
  4.     Phone *dpa = new DecoratorPhoneA(iphone); //装饰,增加挂件  
  5.     Phone *dpb = new DecoratorPhoneB(dpa);    //装饰,屏幕贴膜  
  6.     dpb->ShowDecorate();  
  7.     delete dpa;  
  8.     delete dpb;  
  9.     delete iphone;  
  10.     return 0;  
  11. }  

       装饰模式提供了更加灵活的向对象添加职责的方式。可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。装饰模式提供了一种“即用即付”的方
法来添加职责。它并不试图在一个复杂的可定制的类中支持所有可预见的特征,相反,你可以定义一个简单的类,并且用装饰类给它逐渐地添加功能。可以从简单的部件组合出复杂的功能。[DP]

       在本文的例子中,我们定义了两个具体的手机类,iPhone类和NokiaPhone类,通过单独的装饰类为它们添加特性,从而组合出复杂的功能。
       本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985

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

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

相关文章

【转】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个小时就过去了…

【转】DICOM:DICOM Print服务中PresentationContext协商之 MetaSOPClass与SOPClass对比分析!!!!!!!!

转自&#xff1a;https://zssure.blog.csdn.net/article/details/45119841 背景&#xff1a; 最近项目中遇到的实际问题较多&#xff0c;且大多是较隐蔽的、不易被发现的错误。究其根源来看&#xff0c;还是对DICOM3.0协议中的细节掌握不够仔细&#xff0c;因而导致在实际编码…

2008秋季-计算机软件基础-未交实验报告名单

实验四 序号&#xff1a;108 实验五 序号&#xff1a;108&#xff0c;225&#xff0c;226 351 实验二 353 实验一 356 实验二 360 实验三 365 实验三 367 实验三 368 实验二 372 实验五 转载于:https://www.cnblogs.com/emanlee/archive/2008/11/02/1324910.html

操作系统真实的虚拟内存是什么样的

1. 内存及虚存基本布局 提起虚存&#xff0c;大都能说出几条来。 对于32位系统&#xff0c;大多数操作系统都会将4GB的内存空间的一部分挪给内核使用&#xff0c;应用程序无法直接访问这一段内存&#xff0c;这部分内存空间称为内核空间。Windows默认情况下会将高地址的2GB分配…

约瑟夫问题c语言链表解法,约瑟夫环问题 --链表 C语言

总共有m个人在圆桌上&#xff0c;依次报名&#xff0c;数到第n个数的人退出圆桌&#xff0c;下一个由退出人下一个开始继续报名&#xff0c;循环直到最后一个停止将编号输出#include #include typedef struct Head * PHead;typedef struct Node * PNode;struct Head{PNode Next…