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
)
);