C++ 设计模式之装饰模式


设计模式之装饰模式


装饰模式,动态地给一个对象添加一些额外的职责(不一定重要的功能,只是偶然一次执行),就增加功能来说,装饰模式比生成子类更为灵活。其UML图如下:

  ConcreteCponent定义了一个具体的对象,ConcreteDecorator类是用来装饰ConcreteCponent的。在Decorator类内由一个Cponent的引用实际是指向ConcreteCponent的。一旦一个装饰类装饰了一个组件,则该装饰类即代表了该组件,因为它们都有相同的基类,并且所有的装饰类都有相同的基类,所以可以连续不断的装饰下去。

示例代码如下:

1 // DecoratorModle.h文件 2 #pragma once 3 4 #include <iostream> 5 // 基础类 6 class Cponent 7 13 }; 14 15 class ConcreteCponent : public Cponent 16 22 }; 23 // 装饰者 24 class Decorator : public Cponent 25 31 virtual void Operation() 32 35 protected: 36 Cponent * m_pCponent; 37 }; 38 // 装饰者A 39 class Decorator_A : public Decorator 40 47 }; 48 // 装饰者B 49 class Decorator_B : public Decorator 50 57 };

测试代码如下:

1 #include <iostream> 2 #include "DecoratorModel.h" 3 4 int main() 5

测试结果如下:

  装饰模式在装饰模式中只能根根据需求按顺序装饰起来,一个Decorator对象只能装饰一个具体组件一次,切忌不能循环装饰。

  装饰模式是为已有功能动态地添加更多的一种方式。当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主要类的复杂度,而这些新加入的东西仅仅是为了满足一些某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类种,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时更具需要有选择地、按顺序地使用装饰功能包装对象了。其优点是把类种的装饰功能从类种搬移去除,这样可以简化原有的类。这样做更大的好处就是有效地把类的核心职责和装饰功能区分开了。而且可以去除相关类种重复的装饰逻辑。



上一篇:代码的坏味道

下一篇:C++ 设计模式之享元模式


C/C&#x2B;&#x2B;
Copyright © 2002-2019 k262电脑网 www.k262.cn 皖ICP备2020016292号
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!QQ:251442993 热门搜索 网站地图