设计模式(9) 装饰器模式(DECORATOR)(二)

2014-11-24 02:55:16 · 作者: · 浏览: 1
lComponent*); virtual void Draw(); virtual void Resize(); // ...... private: VisualComponent* _component; // 这个示例变量在构造器中被初始化,通过这个变量,进行请求的转发 }; // 对于VisualComponent接口中定义的每一个操作,Decorator类都定义了一个缺省的实现,这一实现将请求转发给_component void Decorator::Draw() { _component->Draw(); } void Decorator::Resize() { _component->Resize(); } // Decorator的子类定义了特殊的装饰功能 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); } // 类似的可实现ScrollDecorator和DropShadowDecorator,给界面添加滚动和阴影功能
下面的代码展示了如何使用装饰器创建一个具有边界的可滚动的TextView
//首先将一个可视组件放入窗口对象中,这个操作为Window中的SetContents操作
void Window::SetContents(VisualComponent* contents) 
{
    // ......
}

// 现在创建一个正文视图,放入窗口中
Window* window = new Window;
TextView* textView = new TextView;
window->SetContents(textView);

// 如果想要增加滚动条,我们需要在将它放入窗口之前进行装饰
window->SetContents(
    new BorderDecorator(
        new ScrollDecorator(textView), 1
        )
    );


相关模式: 适配器模式给予对象一套全新的接口,而装饰器模式并不改变对象的接口,只改变对象的职责 组合模式:可以将装饰器模式视为一个退化的,仅有一个组件的组合。 Strategy模式:用一个装饰器可以改变对象的外表,而Strategy模式使得你可以改变对象的内核。这时动态改变对象的两种途径。

参考资料: 《设计模式:可复用面向对象软件的基础》