Omitting the abstract Decorator class.

Quic kT i me™ and a
T IFF (Unc ompres s ed) dec ompres s or
are needed t o s ee thi s pi c ture.
Decorator
Stéphane Ducasse
[email protected]
http://www.listic.univ-savoie.fr/~ducasse/
S.Ducasse
1
License: CC-Attribution-ShareAlike 2.0
http://creativecommons.org/licenses/by-sa/2.0/
S.Ducasse
2
Decorator
•
•
•
•
•
•
•
S.Ducasse
Attach additional responsib
ilities to an object dynamically.
Decorators provide a
flexible alternative to
subclassing for extending
functionality.
Aka: Wrapper
3
Decorator Intent
•
•
•
•
S.Ducasse
Attach additional responsib ilities to an object
dynamically.
Decorators provide a flexible alternative to
subclassing for extending functionality.
Aka: Wrapper
4
Motivation
•
Adding behavior to individual object not entire
class
•
•
S.Ducasse
scrollbar
border
5
Inheritance?
•
•
•
S.Ducasse
Does not work well
Too much combination border, color, scrollbars,
bounds, translation...
To static: Clients cannot control when to put a
border or not...
6
Decorator
•
•
•
S.Ducasse
Enclose the component into another one that
adds border...in another one that adds scrollbar...
The decorator conforms to the interface of the
component it decorates so that its presence is
transparent to the component's clients.
The decorator forwards requests to the
component and may perform additional actions
(such as drawing a border) before or after
forwarding
7
Decorator Solution
S.Ducasse
8
Applicability
•
•
•
S.Ducasse
When responsibilities can be withdrawn
When responsibilities can be added transparently
When subclassing is not possible (combination
explosion)
9
Possible Decorator Structure
S.Ducasse
10
Participants
•
•
•
•
Component (VisualComponent)
•
ConcreteComponent (TextView)
•
defines an object to which additional responsibilities
can be attached.
Decorator
•
maintains a reference to a Component object and
defines an interface that conforms to Component's
interface.
ConcreteDecorator (BorderDecorator,
ScrollDecorator)
•
S.Ducasse
defines the interface for objects that can have
responsibilities added to them dynamically.
adds responsibilities to the component.
11
Collaborations
•
S.Ducasse
Decorator forwards requests to its Component
object. It may optionally perform additional
operations before and after forwarding the
request.
12
About Identity
•
•
•
•
S.Ducasse
A decorator and its component aren't identical.
A decorator acts as a transparent enclosure. But
from an object identity point of view, a decorated
component is not identical to the component itself.
If the decorator is wrapping, then identity of the
object may change.
Good at construction time, but else should “adapt”
the references from the decorated to the
decorator.
13
Consequences
•
•
•
S.Ducasse
More flexibility than static inheritance. Dynamic
addition of properties
Avoids feature-laden classes high up in the
hierarchy.
Lots of little objects.
14
Implementation
•
•
•
S.Ducasse
Interface conformance. A decorator object's
interface must conform to the interface of the
component it decorates. ConcreteDecorator
classes must therefore inherit from a common
class (at least in C++).
Omitting the abstract Decorator class. There's
no need to define an abstract Decorator class
when you only need to add one responsibility.
Keeping Component classes lightweight.
Component should specify an interface,
decorators are then easier to define
15
Wrapping or not? Conforming or not
•
With decorator
•
With strategies
S.Ducasse
16
Strategies?
•
•
Strategies are a better choice when the
Component class is heavyweight, thereby making
the Decorator pattern too costly to apply.
The Strategy-based approach might require
modifying the component to accommodate new
extensions.
•
•
•
S.Ducasse
a strategy can have its own specialized interface,
a decorator's interface must conform to the
component's.
A strategy needs only define the interface for
rendering a border, which means that the strategy
can be lightweight even if the Component class is
heavyweight.
17
Known Uses
•
VisualWorks Wrapper hierarchy
•
Stream Decorators in VisualWorks:
S.Ducasse
•
•
BOSSTransporter is a stream decorator
FormattedStream is a stream decorator
18