女人常说男人喜新厌旧。仅仅见新人笑,那闻旧人哭,但装饰模式(Decorator)却是一种结交新朋友不忘老朋友的设计模式,很适合去古代当老公(现代是不行的。由于仅仅能娶一个老婆了)。装饰模式的本质是每个装饰对象都被保留一个被其装饰的对象,装饰对象在展示新功能时会同一时候去调用被其装饰的对象的同功能函数,通过如此层层包括调用(即装饰)。形成一个类似链表的结构。接下来的介绍中,我们还会看到很多其它的类似链表结构的设计模式,比方职责链模式、状态模式。
       仍以《大话设计模式》一书中装饰模式的小菜穿衣的样例为例。来看看装饰模式是怎样做到家里红旗不倒,外面彩旗飘飘的。小菜要去会妹子。临行前为了给妹子留个好印象。精选牛仔裤一条。然后搭上简约风T恤,装扮一新后出门。为了可以让小菜搭配不论什么衣服。使用装饰模式描写叙述这一过程。
1、穿衣基类。仅仅有一个函数Show(),显示穿的衣服

class CDress
{
public:virtual  ~CDress()   {}virtual   void    Show(){printf("dressed boy.\n");}
};

2、装饰类基类

class CFinery : public CDress
{
public:CFinery() : m_poDress(NULL)  {}virtual   ~CFinery()  {}virtual   void    Show(){if (m_poDress){m_poDress->Show();}}void   Decorate(CDress* poCDress){m_poDress = poCDress;}private:CDress*   m_poDress;
};

3、T恤和牛仔裤的详细装饰类

class CTShirt : public   CFinery
{
public:virtual  ~CTShirt()  {}void  Show(){printf("Tshirt ");CFinery::Show();}
};class CJeans : public CFinery
{
public:virtual  ~CJeans()   {}void  Show(){printf("Jeans ");CFinery::Show();}
};

这里需注意,装饰类对象的Show()函数在显示出本对象的装扮的同一时候,须要去调用装饰基类的Show()函数,以显示其被装饰对象的旧有装扮。即不能忘了老朋友。

4、装饰过程

int main(int argc, char* argv[])
{CDress oCDress;CTShirt oCTShirt;CJeans oCJeans;oCTShirt.Decorate(&oCDress);oCJeans.Decorate(&oCTShirt);oCJeans.Show();return 0;
}

通过装饰过程能够看出,oCJeans 对象装饰了 oCTShirt 对象。所以 oCJeans 调用 Show() 函数时会调用 oCTShirt 的 Show() 函数,oCTShirt 又装饰了 oCDress 对象。这时 oCTShirt 又会调用 oCDress 的 Show() 函数。有点类似递归,也有点类似链表的味道,当然我们知道递归须要有一个终结者的。不然就没完没了了,所以最后被装饰的对象 oCDress 是不在有不论什么装饰对象的。

同一时候,假设小菜的妹子不喜欢这套打扮风格了,说要小菜把T恤换成衬衫,这时我们仅仅要新增一个衬衫装饰类 CShirt ,然后把 oCJeans 的装饰对象换成 CShirt 就可以。这里可见,使用了装饰模式后,换衣服都方便灵活多了。

5、装饰模式的应用
         装饰模式适合在原有功能上添加了新功能,可是新功能被调用前/后仍须要调用原有功能的情况,特别适合功能一层一层的扩展,同一时候保持旧有功能的正常调用的场景。

比方我们设计一个编辑框的控件类,最初仅仅有编辑文字的功能,我们新增一个装饰类后,我们能编辑出彩色的文字,这时我们仅仅须要设置控件的背景颜色,然后去调用旧的对象编辑文字功能就可以。过一段时间老大提新要求了,要求这个编辑框控件要搞和谐社会,要屏蔽敏感词,这时我们再新增一个装饰类。添加建设和谐社会功能后,再去调用编辑彩色文字的装饰类。当然,我们还能灵活变动,搞和谐社会的装饰类为了不花哨,也能够直接装饰原来的编辑框控件类。抛弃中间搞彩色文字的过程。

转载于:https://www.cnblogs.com/bhlsheji/p/5365311.html

大话设计模式C++版——装饰模式相关推荐

  1. 大话设计模式C++版——代理模式

        本篇開始前先发个福利,程杰的<大话设计模式>一书高清电子版(带文件夹)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gu ...

  2. [大话设计模式C++版] 第17章 在NBA我需要翻译 —— 适配器模式

    源码可以在这里找到 大话设计模式C++版 篮球翻译适配器 //Player.h 球员基类 #include <QString>class Player {protected:QString ...

  3. [大话设计模式C++版] 第12章 牛市股票还会亏钱 —— 外观模式

    源码可以在这里找到 大话设计模式C++版 股民炒股代码 //main.cpp #include <iostream>using namespace std;//股票1 class Stoc ...

  4. [大话设计模式C++版] 第14章 老板回来,我不知道 —— 观察者模式

    源码可以在这里找到 大话设计模式C++版 双向耦合的代码 //Secretary.h 秘书类 #include <QList>using namespace std; class Stoc ...

  5. [大话设计模式C++版] 第13章 好菜每回味不同 —— 建造者模式

    源码可以在这里找到 大话设计模式C++版 建造小人一 实现画小人的程序 //Widget.cpp void Widget::paintEvent(QPaintEvent *event) {QPaint ...

  6. 《大话设计模式 C++版》

    在我的资源有下载: 大话设计模式 C++ 设计模式分为三种类型,共23类. 创建型模式:单件模式.抽象工厂模式.建造者模式.工厂方法.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式. ...

  7. 2.商场促销 - 策略模式 (大话设计模式Kotlin版)

    编程题:制作商场收银软件 利用编程做一个简易的商场收银系统,营业员根据客户购买的商品的单价与数量,向客户收费. 快速实现 马上想到的解决思路:无非是提供两个输入,分别对应商品单价与数量,然后通过计算得 ...

  8. 17.在NBA我需要翻译-适配器模式(大话设计模式kotlin版)

    适配器模式 基本概念 适配器:就是使得一个东西适合另外一个东西的东西. 定义:适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一 ...

  9. 大话设计模式学习笔记 -- 装饰模式

    目录 Person类 装饰抽象类 装饰抽象类具体实现类 客户端代码 Person类 public class Person {private String name;public Person(){} ...

最新文章

  1. 自动发布工具应该具备的11个标准特征
  2. VALID SAME
  3. 醒醒,迪卡侬请停止“低调”!
  4. HTML第十章作业代码,HTML教程10第十章.doc
  5. vb定义模块且使用模块_ET200S 1 STEP 步进模块使用入门
  6. Flutter for Web 详细预研
  7. Bootstrap输入框组中可以使用的元素
  8. 【Flink】Flink Remote Shuffle 开源:面向流批一体与云原生的 Shuffle 服务
  9. python数据库介绍_Python数据库:MYSQL讲解介绍
  10. C#与.net的区别
  11. DXUT框架剖析系列文章(原创:天行健 君子当自强而不息)
  12. java.util.stream.LongStream
  13. Beyond Compare代码对比工具国内镜像下载
  14. ffmpeg命令分析-ss
  15. 加权最小二乘法matlab,加权最小二乘法matlab
  16. unity 别踩白块儿
  17. HTML5实现3D校园地图思路
  18. 如何找回u盘里丢失的文件,u盘里的文件丢了怎么找回
  19. 干货全拿走-用ExcelVBA做个股多模型交叉验证择时交易套利及回测系统
  20. 生物信息百Jia软件(二十):lumpy

热门文章

  1. 【Linux系统】Linux命令之文件管理
  2. node.js 搭建blog
  3. mysql的in和not in的用法(特别注意not in结果集中不能有null)
  4. 《JS权威指南学习总结--第八章 函数》
  5. Entityframework Code First 系列之项目搭建
  6. 2015-12-08 English
  7. 查看Linux软件信息
  8. POJ 2391 Ombrophobic Bovines 网络流 建模
  9. 算法导论9.2-3习题解答(寻找第i小的数)
  10. (转)国外软件外包项目网站(适用软件兼职)