C++装饰器模式
UML图:

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
//抽象类Cake
class Cake
{
public:
string m_name;
//如果一个类中有纯虚函数
//那么这个类无法被实例化
//需要先继承再实例化
virtual void show() = ;
};
class ConcreteCake:public Cake
{
public :
ConcreteCake()
{
m_name = "原始蛋糕";
} virtual void show()
{
cout << m_name.c_str() << endl;
} };
//抽象类Decorator
class Decorator :public Cake
{
public :
Cake * pCake;
virtual void show() = ;
};
//具体奶油类
class DecCream :public Decorator
{
public :
DecCream(Cake * cake)
{
pCake = cake;
} void show()
{
pCake->show();
cout << "加奶油" << endl;
} };
//具体饼干类
class DecBiscuits :public Decorator
{
public:
DecBiscuits(Cake * cake)
{
pCake = cake;
} void show()
{
pCake->show();
cout << "加饼干" << endl;
} };
int main()
{
//原始蛋糕:先加奶油,再加饼干
//ConcreteCake * pOrinCake = new ConcreteCake() ;
//DecCream * pCream = new DecCream(pOrinCake);
//DecBiscuits * pBiscuits = new DecBiscuits(pCream);
//pBiscuits->show(); //原始蛋糕:先加饼干,再加奶油
ConcreteCake * pOrinCake = new ConcreteCake() ;
DecBiscuits * pBiscuits = new DecBiscuits(pOrinCake);
DecCream * pCream = new DecCream(pBiscuits);
pCream->show();
//可以看到上面创建了三个实例,单步调试可以观察到逐个调用实例show()方法的过程
system("pause");
}
装饰器模式的特点就是:
根据这个例子来说,重写show()的时候,会调用需要被装饰的类的原本的show(),在原来的show()的基础上再添加上自己的东西.
更通用地说,就是为方法增加新的功能,其实现机制是重写这个方法,并在重写的过程当中调用原本的方法并添加新的功能.
不改变原来方法的内容,只增不减.
优点:
可以根据自己的需要选择自己需要的部件(可以不按顺序地,无相互联系地)进行组合,以达到对象的方法随机应变拓展的效果,比继承来得更加灵活,而且更偏向于组合的思维模式.
C++装饰器模式的更多相关文章
- PHP 装饰器模式
装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...
- 设计模式-装饰器模式(Decrator Model)
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...
- php设计模式 装饰器模式
装饰器模式,可以动态地添加修改类的功能. 一个类提供了一项功能,如果要修改并添加额外的功能,传统的编程模式需要写一个子类继承它,并重新实现类的方法.使用装饰器模式,仅需要在运行时添加一个装饰器对象即可 ...
- Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- 说说设计模式~装饰器模式(Decorator)
返回目录 装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序, ...
- 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现
返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...
- (十)装饰器模式详解(与IO不解的情缘)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. LZ到目前已经写了九个设计模 ...
- 【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)
<?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; ...
- IOS设计模式之二(门面模式,装饰器模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- 装饰器模式(Decorator)
转自http://blog.csdn.net/hust_is_lcd/article/details/7884320 1.认识装饰器模式 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象 ...
随机推荐
- 【CSS3】纯CSS3制作页面切换效果
此前写的那个太复杂了,来点简单的核心 <html> <head> <title></title> <style type="text/c ...
- 第三次脱发——Scurm学(ctrl)习(C)心得
Scrum 学习心得: 首先,敏捷并不是一门具体的技术,而是一种理念或者说是一种思想.它可以指导我们更加高效的开发. 其次,敏捷开发都具有以下共同的特征: 迭代式开发 增量交付 开发团队和用户反馈推动 ...
- Java 对象序列化机制详解
对象序列化的目标:将对象保存到磁盘中,或允许在网络中直接传输对象. 对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,通过网络将这种二进制流传 ...
- spark mllib docs,MLlib: RDD-based API
MLlib: RDD-based API This page documents sections of the MLlib guide for the RDD-based API (the spar ...
- uni-app 快速认识
uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.H5.以及各种小程序(微信/阿里/百度/头条/QQ)等多个平台. 即使不跨端,un ...
- 用diiv实现多个方块居中嵌套--padding
文章地址 https://www.cnblogs.com/sandraryan/ 案例:用diiv嵌套多个正方形,配合盒模型相关知识,使每个div在他的父元素上居中.(每个div中心点对齐) 涉及到m ...
- Flex AIR自定义Mobile的弹出框组件
做Flex Mobile开发的人应该知道,Flex为手机应用并没有提供弹出框组件,需要自定义. 通过查找文档.资料,我做出一个效果还算不错的弹出框组件,可以适用于手机设备上,不多讲,直接贴源码,相信对 ...
- Spring Boot Thymeleaf 使用详解
在上篇文章Spring Boot (二):Web 综合开发中简单介绍了一下 Thymeleaf,这篇文章将更加全面详细的介绍 Thymeleaf 的使用.Thymeleaf 是新一代的模板引擎,在 S ...
- junit 测试套件Suite
junit测试套件,就是可以运行一个测试类使得一个或一些测试类被junit测试运行 见代码: 测试套件类: import org.junit.runner.RunWith; import org.ju ...
- linux ioctl 接口
大部分驱动需要 -- 除了读写设备的能力 -- 通过设备驱动进行各种硬件控制的能力. 大 部分设备可进行超出简单的数据传输之外的操作; 用户空间必须常常能够请求, 例如, 设 备锁上它的门, 弹出它的 ...