Decorator模式,动态地给一个对象添加一些额外的职责。
// 控件抽象基类
class Widget {
public:
Widget();
virtual void Draw();
}
// 具体的控件--窗口
class Window : public Widget {
public:
Window();
virtual void Draw();
}
// 控件的装饰者
class Decorator : public Widget {
public:
Decorator(Widget*);
virtual void Draw();
private:
Widget* widget;
}
Decorator::Decorator(Widget* w) {
this->widget = w;
}
void Decorator::Draw() {
this->widget->Draw();
}
// 装饰者的子类,给控件添加边框效果
class BorderDecorator : public Decorator {
public:
BorderDecorator(Widget*, int borderWidth);
virtual void Draw();
private:
void DrawBorder();
private:
Widget* widget;
int width;
}
BorderDecorator::BorderDecorator(Widget* widget, int borderWidth) {
this->widget = widget;
this->width = borderWidth;
}
void BorderDecorator::Draw() {
this->widget->Draw();
this->DrawBorder();
}
// 装饰者的子类,给控件添加滚动条
class ScrollDecorator : public Decorator {
public:
ScrollDecorator(Widget*);
virtual void Draw();
private:
void DrawScrollBar();
private:
Widget* widget;
}
ScrollDecorator::ScrollDecorator(Widget* widget) {
this->widget = widget;
}
void ScrollDecorator::Draw() {
this->widget->Draw();
this->DrawScrollBar();
}
void Test() {
Widget* window = new Window();
Widget* windowWithScroll = new ScrollDecorator(window); // 带滚动条的window
Widget* windowWithScrollAndBorder = new BorderDecorator(windowWithScroll, 1);// 带滚动条和边框的window
windowWithScrollAndBorder->Draw();
// destroy ...
}
PS. 我的设计模式系列blog,《设计模式》专栏,通过简单的示例演示设计模式,对于初学者很容易理解入门。深入学习请看GoF的《设计模式》。