设计模式C++实现(7)——装饰模式
装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。下面给出装饰模式的UML图。
在这种设计中,手机的装饰功能被独立出来,可以单独发展,进而简化了具体手机类的设计。下面给出Phone类的实现:
- //公共抽象类
- class Phone
- {
- public:
- Phone() {}
- virtual ~Phone() {}
- virtual void ShowDecorate() {}
- };
具体的手机类的定义:
- //具体的手机类
- class iPhone : public Phone
- {
- private:
- string m_name; //手机名称
- public:
- iPhone(string name): m_name(name){}
- ~iPhone() {}
- void ShowDecorate() { cout<<m_name<<"的装饰"<<endl;}
- };
- //具体的手机类
- class NokiaPhone : public Phone
- {
- private:
- string m_name;
- public:
- NokiaPhone(string name): m_name(name){}
- ~NokiaPhone() {}
- void ShowDecorate() { cout<<m_name<<"的装饰"<<endl;}
- };
装饰类的实现:
- //装饰类
- class DecoratorPhone : public Phone
- {
- private:
- Phone *m_phone; //要装饰的手机
- public:
- DecoratorPhone(Phone *phone): m_phone(phone) {}
- virtual void ShowDecorate() { m_phone->ShowDecorate(); }
- };
- //具体的装饰类
- class DecoratorPhoneA : public DecoratorPhone
- {
- public:
- DecoratorPhoneA(Phone *phone) : DecoratorPhone(phone) {}
- void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
- private:
- void AddDecorate() { cout<<"增加挂件"<<endl; } //增加的装饰
- };
- //具体的装饰类
- class DecoratorPhoneB : public DecoratorPhone
- {
- public:
- DecoratorPhoneB(Phone *phone) : DecoratorPhone(phone) {}
- void ShowDecorate() { DecoratorPhone::ShowDecorate(); AddDecorate(); }
- private:
- void AddDecorate() { cout<<"屏幕贴膜"<<endl; } //增加的装饰
- };
客户使用方式:
- int main()
- {
- Phone *iphone = new NokiaPhone("6300");
- Phone *dpa = new DecoratorPhoneA(iphone); //装饰,增加挂件
- Phone *dpb = new DecoratorPhoneB(dpa); //装饰,屏幕贴膜
- dpb->ShowDecorate();
- delete dpa;
- delete dpb;
- delete iphone;
- return 0;
- }
装饰模式提供了更加灵活的向对象添加职责的方式。可以用添加和分离的方法,用装饰在运行时刻增加和删除职责。装饰模式提供了一种“即用即付”的方
法来添加职责。它并不试图在一个复杂的可定制的类中支持所有可预见的特征,相反,你可以定义一个简单的类,并且用装饰类给它逐渐地添加功能。可以从简单的部件组合出复杂的功能。[DP]
在本文的例子中,我们定义了两个具体的手机类,iPhone类和NokiaPhone类,通过单独的装饰类为它们添加特性,从而组合出复杂的功能。
本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985
设计模式C++实现(7)——装饰模式相关推荐
- Java设计模式(7)装饰模式(Decorator模式)
Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这 ...
- 设计模式-结构型模式-装饰模式
设计模式-结构型模式-装饰模式 栗子 以成绩单需要家长签字为要求. 成绩单类图 // 抽象成绩单 public abstract class SchoolReport{// 成绩单你的成绩情况publ ...
- java设计模式学习笔记之装饰模式
java设计模式学习笔记之装饰模式 尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697 这是一个使用策略模式和构建模式设计的网络请求框架,去看看吧& ...
- 对设计模式的总结之装饰模式与代理模式
前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓 ...
- Head First设计模式读书笔记三 装饰模式(个人理解:包装模式)
本文示例代码材料源自Head First设计模式 以前整理自己整理的装饰模式的链接:https://blog.csdn.net/u011109881/article/details/58719049 ...
- 设计模式(七)装饰模式
相关文章 设计模式(一)设计六大原则 设计模式(二)单例模式的七种写法 设计模式(三)建造者模式 设计模式(四)简单工厂模式 设计模式(五)观察者模式 设计模式(六)代理模式 1.装饰模式简介 装饰模 ...
- 设计模式——代理模式与装饰模式的异同
两种模式的特点 装饰模式: 在不改变接口的前提下,动态扩展对象的访问. 动态继承,让类具有在运行期改变行为的能力. 装饰模式,突出的是运行期增加行为,这和继承是不同的,继承是在编译期增加行为. 强调: ...
- .NET中的设计模式——一步步发现装饰模式
前言 过去我的一个朋友常说,学习任何编程语言最困难的部分是运行"Hello World",之后一切都很容易.多年以后,我才意识到他说的很对.学习设计模式的基本目标是要用它,尤其是帮 ...
- 【Java设计模式】简单学装饰模式——来杯咖啡,先糖后奶
目录 说明 目标 实现方式 应用场景 其他链接 说明 结构型模式之一,其他还有适配器模式.桥接模式.组合模式.外观模式.享元模式.代理模式 装饰者模式(Decorator Pattern)的精髓在于动 ...
- 【设计模式十六之装饰模式】装饰者模式
Decorator Pattern装饰模式 细说装饰模式 细说装饰模式 定义 UML模型 场景 场景一 场景二 代码 代码一 代码二 基于UML的代码 装饰模式应用和注意事项 细说装饰模式 提示: 博 ...
最新文章
- PHP实现将任意尺寸的图片裁剪后等比缩放到任意尺寸的透明图片上,并实现图片翻转...
- 公司内部 action调用持久层规范
- Spring MVC的异步模式DefferedResult
- 由胡润百富榜联想到的
- 统一流控服务开源:基于.Net Core的流控服务
- Free SQLSever 2008的书
- 用php打出2020年是庚子鼠年,2020年庚子鼠年,做到三善,命运必变!
- tensorflow实战讨论
- mysql sysdate本周_mysql 查询当天、本周,本月,上一个月的数据
- 总结 图(有向图、无向图、权、度、存储结构、邻接矩阵、领接表 概念)
- java 牙位图插件_牙医的骄傲-智能牙位图中文医疗应用app全球排名No.1
- python 批量修改图片尺寸
- Anaconda2020安装与使用
- 小米盒子显示连不上服务器,小米盒子连不上WiFi?这七个技巧绝对管用
- Android简易本地音乐播放器,简单实现Android本地音乐播放器
- 2020-10-06
- 《Real time Detection of Lane Markers in Urban Streets》阅读笔记
- Python中的Lasso回归之最小角算法LARS
- 海信linux系统信息,海信公交车数据采集系统 调试信息
- 视频教程-微信小程序系统教程[2/3阶段]_核心技术-微信开发