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

设计模式C++实现(7)——装饰模式相关推荐

  1. Java设计模式(7)装饰模式(Decorator模式)

    Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...

  2. 设计模式-结构型模式-装饰模式

    设计模式-结构型模式-装饰模式 栗子 以成绩单需要家长签字为要求. 成绩单类图 // 抽象成绩单 public abstract class SchoolReport{// 成绩单你的成绩情况publ ...

  3. java设计模式学习笔记之装饰模式

    java设计模式学习笔记之装饰模式 尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697 这是一个使用策略模式和构建模式设计的网络请求框架,去看看吧& ...

  4. 对设计模式的总结之装饰模式与代理模式

    前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓 ...

  5. Head First设计模式读书笔记三 装饰模式(个人理解:包装模式)

    本文示例代码材料源自Head First设计模式 以前整理自己整理的装饰模式的链接:https://blog.csdn.net/u011109881/article/details/58719049 ...

  6. 设计模式(七)装饰模式

    相关文章 设计模式(一)设计六大原则 设计模式(二)单例模式的七种写法 设计模式(三)建造者模式 设计模式(四)简单工厂模式 设计模式(五)观察者模式 设计模式(六)代理模式 1.装饰模式简介 装饰模 ...

  7. 设计模式——代理模式与装饰模式的异同

    两种模式的特点 装饰模式: 在不改变接口的前提下,动态扩展对象的访问. 动态继承,让类具有在运行期改变行为的能力. 装饰模式,突出的是运行期增加行为,这和继承是不同的,继承是在编译期增加行为. 强调: ...

  8. .NET中的设计模式——一步步发现装饰模式

    前言 过去我的一个朋友常说,学习任何编程语言最困难的部分是运行"Hello World",之后一切都很容易.多年以后,我才意识到他说的很对.学习设计模式的基本目标是要用它,尤其是帮 ...

  9. 【Java设计模式】简单学装饰模式——来杯咖啡,先糖后奶

    目录 说明 目标 实现方式 应用场景 其他链接 说明 结构型模式之一,其他还有适配器模式.桥接模式.组合模式.外观模式.享元模式.代理模式 装饰者模式(Decorator Pattern)的精髓在于动 ...

  10. 【设计模式十六之装饰模式】装饰者模式

    Decorator Pattern装饰模式 细说装饰模式 细说装饰模式 定义 UML模型 场景 场景一 场景二 代码 代码一 代码二 基于UML的代码 装饰模式应用和注意事项 细说装饰模式 提示: 博 ...

最新文章

  1. PHP实现将任意尺寸的图片裁剪后等比缩放到任意尺寸的透明图片上,并实现图片翻转...
  2. 公司内部 action调用持久层规范
  3. Spring MVC的异步模式DefferedResult
  4. 由胡润百富榜联想到的
  5. 统一流控服务开源:基于.Net Core的流控服务
  6. Free SQLSever 2008的书
  7. 用php打出2020年是庚子鼠年,2020年庚子鼠年,做到三善,命运必变!
  8. tensorflow实战讨论
  9. mysql sysdate本周_mysql 查询当天、本周,本月,上一个月的数据
  10. 总结 图(有向图、无向图、权、度、存储结构、邻接矩阵、领接表 概念)
  11. java 牙位图插件_牙医的骄傲-智能牙位图中文医疗应用app全球排名No.1
  12. python 批量修改图片尺寸
  13. Anaconda2020安装与使用
  14. 小米盒子显示连不上服务器,小米盒子连不上WiFi?这七个技巧绝对管用
  15. Android简易本地音乐播放器,简单实现Android本地音乐播放器
  16. 2020-10-06
  17. 《Real time Detection of Lane Markers in Urban Streets》阅读笔记
  18. Python中的Lasso回归之最小角算法LARS
  19. 海信linux系统信息,海信公交车数据采集系统   调试信息
  20. 视频教程-微信小程序系统教程[2/3阶段]_核心技术-微信开发

热门文章

  1. 实验15 安装新的int 9中断例程
  2. jz2440开发板修改UBOOT支持NAND FLASH
  3. 嵌入式Linux操作系统移植IMX6开发板之实现USB 自动挂载
  4. 吉他谱----see you again
  5. BUUOJ misc 二维码
  6. [优先队列][堆] Luogu P4505 组合子逻辑
  7. speech模块实现语音识别
  8. bzoj1094[ZJOI2007]粒子运动 计算几何
  9. eclipse 断点调试快捷键
  10. php 标点符号,php 过滤英文标点符号及过滤中文标点符号代码