Thursday, April 14, 2011

Design Pattern:Decorator

The Decorator attaches additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.Also called as Wrapper.


Sometimes we want to add responsibilities to individual objects (aTextView ) not to an entire class. ( i.e. how to give control to client to decorate the component with a border / a scroll bar )





  • One way to add responsibilities is with inheritance.Inheriting a border with another class puts a border along very subclass instance ( inflexible solution ).
  • A more flexible approach is to enclose the component in another objects that adds the border. The enclosing object is called Decorator.
  • The Decorator confirm to interface of the component it decorate so that its presence is transparent to its components clients.


Use Decorator

  • 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 in 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.




Decorator forwards requests to its Component object. It may optionally perform additional operations before and after forwarding the request.


  • More flexibility than static inheritance:
    1. to add or delete responsibilities to objects at runtime simply by attaching and detaching them.
    2. Providing different decorator classes for a specific component class lets you mix and match responsibilities.
  • Avoids feature-laden classes high up in the hierarchy:
    1. Decorator offers a pay-as-you-go approach to adding responsibilities.Instead of trying to support all features in a complex, customizable class, you can define simple class and add functionality incrementally with Decorator objects.
  • A decorator and its component aren’t identical:
    1. A decorator acts as a transparent enclosure.
  • Lots of little objects :
    1. Decorator often results in system composed of lots of little objects that all look like, this may leed to maintenance nightmare and hard to learn.



Related Patterns

Adapter: Adapter changes an object's interface, Decorator enhances an object's responsibilities. Decorator is thus more transparent to the client. As a consequence, Decorator supports recursive composition, which isn't possible with pure Adapters

Adapter provides a different interface to its subject. Proxy provides the same interface. Decorator provides an enhanced interface

Composite: A decorator can be viewed as a degenerate composite with only one component. However, a decorator adds additional responsibilities—it isn’t intended for object aggregation.

No comments: