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++装饰器模式的更多相关文章

  1. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  2. 设计模式-装饰器模式(Decrator Model)

    文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...

  3. php设计模式 装饰器模式

    装饰器模式,可以动态地添加修改类的功能. 一个类提供了一项功能,如果要修改并添加额外的功能,传统的编程模式需要写一个子类继承它,并重新实现类的方法.使用装饰器模式,仅需要在运行时添加一个装饰器对象即可 ...

  4. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  5. 说说设计模式~装饰器模式(Decorator)

    返回目录 装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序, ...

  6. 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

    返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...

  7. (十)装饰器模式详解(与IO不解的情缘)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. LZ到目前已经写了九个设计模 ...

  8. 【PHP设计模式 09_ZhuangShiQi.php】装饰器模式 (decorator)

    <?php /** * [装饰器模式 (decorator)] * 有时候发布一篇文章需要经过很多人手,层层处理 */ header("Content-type: text/html; ...

  9. IOS设计模式之二(门面模式,装饰器模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  10. 装饰器模式(Decorator)

    转自http://blog.csdn.net/hust_is_lcd/article/details/7884320 1.认识装饰器模式 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象 ...

随机推荐

  1. 箭头函数表达式和声名式函数表达式的区别以及 Function.prototype的bind, apply,call方法

    箭头函数不能用做构造函数 箭头函数没有arguments参数 箭头函数没有自己的this,是从作用域链上取this,是与箭头函数定义的位置有关的,与执行时谁调用无关,所以用call,apply,bin ...

  2. javascript 容易混淆遗忘的基础知识

    1.  标识符     所谓标识符,就是指变量.函数.属性的名字,或者函数的参数.标识符可以是按照下列格式规则组合起来的一或多个字符:     1.1   第一个字符必须是一个字母.下划线( _ )或 ...

  3. Android Animation动画详解(一): 补间动画

    前言 你有没有被一些APP中惊艳的动画效果震撼过,有没有去思考,甚至研究过这些动画是如何实现的呢? 啥?你没有思考,更没有研究过? 好吧,那跟着我一起来学习下如何去实现APP中那些让我们惊羡的动画特效 ...

  4. HTML5的5个的新特性

    特性1:正则表达式 无须使用服务端的检测,使用浏览器的本地功能,就可以帮助你判断邮箱的格式,URL,电话,防止用户输入错误的信息,通过H5的pattern属性,很方便的整合这个功能. <inpu ...

  5. gSOAP 使用

    1. wsdl2h 生成服务定义头文件 wsdl2h -o calc.h http://www.genivia.com/calc.wsdl 2. 从服务定义头文件calc.h生成客户端代码 soapc ...

  6. mac 安装 adb

    安装命令 brew cask install android-platform-tools 测试安装情况 adb devices 设备打开开发者模式 略 查看log并过滤出设备id adb logca ...

  7. 央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家

    央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家 ——已接入NFCS的P2P网贷机构将优先 接入央行征信系统   P2P网贷行业的健康发展依赖于信用体系的支撑和保障,加快完善适应 ...

  8. Mockito 使用

    1. 算术测试类 package com.smart.test.mockito; public interface Calculator { public int add(int a, int b); ...

  9. python模块之序列化模块

    序列化 """ 序列--字符串 序列化--其他数据类型转化为字符串数据类型 反序列化--字符串转化为其他数据类型 """ json模块 &q ...

  10. linux 共享队列

    一个设备驱动, 在许多情况下, 不需要它自己的工作队列. 如果你只偶尔提交任务给队列, 简单地使用内核提供的共享的, 缺省的队列可能更有效. 如果你使用这个队列, 但是, 你 必须明白你将和别的在共享 ...