Decorator - 装饰模式

定义
动态的给一个对象添加一些辅助功能,而不改变原有的类。

案例
假如现在有个文本控件TextView,它可以在屏幕上显示文字,但当文字过多的时候,一个屏幕显示不下,这时就需要给它添加一个滚动条。给一个窗口加一个滚动条不是原有的功能,而是额外的功能,比如还可以加一个黑色外框,而且这些操作不是为某一个控件设定的,其他的控件也可以用,如果用子类化来实现,就得不偿失了。使用装饰模式可以轻松的实现:


Widget是一个窗口基类,它定义了所有窗口类需要的操作。TextView和Decorator继承相同的基类,因为它们必须体统统一的接口。
   
   
  1. Class Widget {
  2. public:
  3. virtual void draw() { ... }
  4. virtual void resize() { ... }
  5. }
  6. class TextView : public Widget {
  7. public:
  8. virtual void draw() { drawText(); }
  9. private:
  10. string m_text;
  11. }
  12. class Decorator : public Widget {
  13. public:
  14. Decorator(Widget* component) { component = component; }
  15. virtual void draw() { m_component->draw(); }
  16. virtual void resize() { m_component->resize(); }
  17. private:
  18. Widget* m_component;
  19. }
  20. class ScrollDecorator : public Decorator {
  21. public:
  22. ScrollDecorator(Widget* widget) : Decorator(widget) { ... }
  23. virtual void draw( Decorator::draw(); drawScroll(); )
  24. virtual void resize( resizeScroll(); )
  25. }
  26. class BorderDecorator : public Decorator {
  27. public:
  28. BorderDecorator(Widget* widget, int width);
  29. virtual void draw() { Decorator::draw(); drawBorder(); }
  30. private:
  31. int m_width;
  32. }
  33. TextView* textView = new TextView();
  34. ScrollDecorator* scrollDecroator = new ScrollDecorator(textView);
  35. BorderDecorator* borderDecorator = new BorderDecorator(scrollDecorator);
适用性
  • 在不影响其他对象的情况下,以动态、透明的方式给某个对象添加功能。
  • 处理可以撤销的功能。
  • 当不能使用子类的方式进行扩充时。
优缺点
  1. 比静态继承更灵活
  2. 避免在层次结构中的类有太多的特性
注意
装饰类Decorator和被装饰对象textView的类有相同的接口,拥共同的基类。

相关模式
Adapter模式是改变对象的接口的方式,提供给其他类使用。
Composite模式是在与对象的聚集,Decorator模式是Composite模式的一个退化,只在于添加一些额外功能。
Strategy模式是改变对象内核的方式进行,Decorator是改变对象的外表。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值