笔记:Gof设计模式--Decorator

1、意图

  Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

2、适应性

  Use the Decorator pattern when

  •  to add responsibilities to individual objects dynamically and transparently, that is, without affecting other objects.
  •  for responsibilities that can be withdrawn.
  •  when extension by subclassing is impractical. Sometimes a large number of independent extensions are possible and would produce an explosion of subclasses to support every combination. Or a class definition may be hidden or otherwise unavailable for subclassing.

3、结构

 

4、示例代码

The following code shows how to implement user interface decorators in C++. We'll assume there's a Component class called VisualComponent And subclass Decorator.

  class VisualComponent { 
    public: 
        VisualComponent(); 
  virtual void Draw(); 
        virtual void Resize(); 
        // ... 
    }; 

 class Decorator : public VisualComponent { 
    public: 
        Decorator(VisualComponent*); 
     
        virtual void Draw(); 
        virtual void Resize(); 
        // ... 
    private: 
        VisualComponent* _component; 
    }; 


For each operation in VisualComponent's interface, Decorator defines a default implementation that passes the request on to _component:

 void Decorator::Draw () { 
        _component->Draw(); 
    } 
 void Decorator::Resize () { 
        _component->Resize(); 
    } 


the class BorderDecorator adds a border to its enclosing component.

class BorderDecorator : public Decorator { 
    public: 
        BorderDecorator(VisualComponent*, int borderWidth);
  virtual void Draw(); 
    private: 
        void DrawBorder(int); 
    private: 
        int _width; 
    }; 
     
    void BorderDecorator::Draw () { 
        Decorator::Draw(); 
        DrawBorder(_width); 
    }  



we want a bordered and scrollable TextView. So we decorate it accordingly before putting it in the window. We'll assume our Window class provides a SetContents operation for this purpose:

  void Window::SetContents (VisualComponent* contents) { 
        // ... 
    } 
  window->SetContents( 
        new BorderDecorator(
        new ScrollDecorator(textView), 1 
        ) 
    );


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值