Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.



Source Code

/**
 * Defines the interface for objects that can have responsibilities added to the
 * dynamically.
 * 
 * @role __Component
 */
public abstract class Component {
	/**
	 * Sample operation.
	 */
	public abstract void doSomeStuff();
}

/**
 * Defines an object to which additional responsibilities can be attached.
 */

public class ConcreteComponent extends Component {
	/** @see patterns.gof.decorator.ComponentdoSomeStuff() */
	public void doSomeStuff() {
		// provide implementation here
	}
}

/**
 * Adds responsibilities to the component.
 */

public class ConcreteDecorator extends Decorator {
	public ConcreteDecorator(Component decorateMe) {
		super(decorateMe);
	}

	/**
	 * Behavior added by decorator.
	 */
	private void addedBehavior() {
		// some extra functionality goes here
	}

	public void doSomeStuff() {
		super.doSomeStuff();
		addedBehavior();
	}
}

/**
 * Maintains the reference to a Component object and defines an interface that
 * conforms to Component's interface
 * 
 * @role __Decorator
 */

public abstract class Decorator extends Component {
	/** reference to the decorated component */
	protected Component component;

	/**
	 * @param decorateMe
	 *            component to decorate
	 */
	public Decorator(Component decorateMe) {
		this.component = decorateMe;
	}

	public void doSomeStuff() {
		component.doSomeStuff();
	}
}