Post on 27-Nov-2014
Embed Size (px)
- 1. Decorator
2. 3. Decorator
- Attach additional responsib
- ilities to an object dynamically.
- Decorators provide a
- flexible alternative to
- subclassing for extending
- Aka: Wrapper
4. Decorator Intent
- Attach additional responsib ilities to an object dynamically.
- Decorators provide a flexible alternative to
- subclassing for extending functionality.
- Aka: Wrapper
- Adding behavior to individual object not entire class
- Does not work well
- Too much combination border, color, scrollbars, bounds, translation...
- To static: Clients cannot control when to put a border or not...
- 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
8. Decorator Solution 9. Applicability
- When responsibilities can be withdrawn
- When responsibilities can be added transparently
- When subclassing is not possible (combination explosion)
10. Possible Decorator Structure 11. Participants
- Component (VisualComponent)
- defines the interface for objects that can haveresponsibilities added to them dynamically.
- ConcreteComponent (TextView)
- defines an object to which additional responsibilitiescan be attached.
- maintains a reference to a Component object and defines an interfacethat conforms to Component's interface.
- ConcreteDecorator (BorderDecorator, ScrollDecorator)
- adds responsibilities to the component.
- Decorator forwards requests to its Component object. It may optionally perform additional operations before and after forwarding the request.
13. About Identity
- 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.
- More flexibility than static inheritance. Dynamic addition of properties
- Avoids feature-laden classes high up in the hierarchy.
- Lots of little objects.
- 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
16. Wrapping or not? Conforming or not
- With decorator
- With 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.
- a strategy can have its own specialized interface,
- a decorator's interfacemustconform 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.
18. Known Uses
- VisualWorks Wrapper hierarchy
- Stream Decorators in VisualWorks:
- BOSSTransporter is a stream decorator
- FormattedStream is a stream decorator