设计模式笔记-结构型模式之四--Decorator

 

意图:

动态的给一个对象添加一个额外的职责

适用性:

1在不影响其它对象的情况下,以动态透明的方式给单个对象添加职责

2处理可以撤销的职责

3当不能采用生成子类的方法进行扩充时

效果:

1比静态继承更灵活,用添加和分离的方法,用装饰在运行时刻增加和删除职责,而且使用Decorator很容易重复添加一个特性

2避免在层次结构高层的类有太多的特征

3Decorator与其它Component不一样,使用装饰不应该依赖对象标识

4有许多小对象

实现:

1接口的一致性 装饰对象的接口必须与它所装饰的Component接口一致,因此所有ConcreteDecorator必须有一个公共的父类。

2省略抽象的Decorator类,当你仅需要添加一个职责时

3 保持Component类的简单性 为了保持接口一致性,组件和装饰必须有共同的父类

4改变对象外壳和内核(Strategy模式用于修改内核,Decorator模式用于修改外壳)

 

 

Decorator.h

 

  1. #include <iostream>
  2. using namespace std;
  3. class VisualComponent
  4. {
  5. public:
  6.     VisualComponent(){cout<<"VisualComponent is created"<<endl;}
  7.     virtual void Draw(){cout<<"Draw on VisualComponent"<<endl;}
  8.     virtual void Resize(){cout<<"Resize on VisualComponent"<<endl;}
  9. };
  10. class Window:public VisualComponent
  11. {
  12. public:
  13.     Window(){cout<<"Window is created"<<endl;}
  14.     void SetContents(VisualComponent *)
  15.     {
  16.         cout<<"Set Contents on an Visual Component "<<endl;
  17.     }
  18. };
  19. class TextView:public VisualComponent
  20. {
  21. public:
  22.     TextView(){cout<<"TextView is created"<<endl;}
  23. };
  24. class Decorator:public VisualComponent
  25. {
  26. public:
  27.     Decorator(VisualComponent* x){_component=x;cout<<"Decorator is added"<<endl;}
  28.     virtual void Draw(){cout<<"Decorate on Component"<<endl;}
  29.     virtual void Resize(){cout<<"Resize on Component"<<endl;}
  30. private:
  31.     VisualComponent* _component;
  32. };
  33. class BorderDecorator:public Decorator
  34. {
  35. public:
  36.     BorderDecorator(VisualComponent* x,int borderWidth):Decorator(x)
  37.     {
  38.         _width = borderWidth;
  39.         cout<<"BorderDecorator is added"<<endl;
  40.     }
  41. virtual void Draw()
  42. {Decorator::Draw();
  43.  DrawBorder();}
  44. private:
  45.     void DrawBorder()
  46.     {cout<<"Draw border on Component,the width is "<<_width<<endl;}
  47.     int _width;
  48. };

main.cpp

  1. #include <iostream>
  2. using namespace std;
  3. #include "Decorator.h"
  4. int main()
  5. {
  6.     Window a;
  7.     TextView b;
  8.     TextView* c=&b;
  9.     a.SetContents(new BorderDecorator(new Decorator(c),1));
  10.     return 0;
  11. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值