package com.iluwatar.decorator;

/**
 * 
 * Decorator pattern is a more flexible alternative to subclassing. The decorator
 * class implements the same interface as the target and uses composition to
 * "decorate" calls to the target.
 * <p>
 * Using decorator pattern it is possible to change class behavior during
 * runtime, as the example shows.
 * 
 */
public class App {

	/**
	 * Program entry point
	 * @param args command line args
	 */
	public static void main(String[] args) {

		// simple troll
		System.out.println("A simple looking troll approaches.");
		Hostile troll = new Troll();
		troll.attack();
		troll.fleeBattle();
		System.out.printf("Simple troll power %d.\n", troll.getAttackPower());

		// change the behavior of the simple troll by adding a decorator
		System.out.println("\nA smart looking troll surprises you.");
		Hostile smart = new SmartTroll(troll);
		smart.attack();
		smart.fleeBattle();
		System.out.printf("Smart troll power %d.\n", smart.getAttackPower());
	}
}

package com.iluwatar.decorator;

/**
 * 
 * The Decorator pattern is a more flexible alternative to subclassing. The Decorator
 * class implements the same interface as the target and uses composition to
 * "decorate" calls to the target. Using the Decorator pattern it is possible to 
 * change the behavior of the class during runtime.
 * <p>
 * In this example we show how the simple {@link Troll} first attacks and then
 * flees the battle. Then we decorate the {@link Troll} with a {@link SmartTroll}
 * and perform the attack again. You can see how the behavior changes after the
 * decoration.
 * 
 */
public class App {

	/**
	 * Program entry point
	 * @param args command line args
	 */
	public static void main(String[] args) {

		// simple troll
		System.out.println("A simple looking troll approaches.");
		Hostile troll = new Troll();
		troll.attack();
		troll.fleeBattle();
		System.out.printf("Simple troll power %d.\n", troll.getAttackPower());

		// change the behavior of the simple troll by adding a decorator
		System.out.println("\nA smart looking troll surprises you.");
		Hostile smart = new SmartTroll(troll);
		smart.attack();
		smart.fleeBattle();
		System.out.printf("Smart troll power %d.\n", smart.getAttackPower());
	}
}

Improve Decorator Javadoc