Decorator Pattern
The Decorator Pattern attaches additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending funtionality.
Decorator Pattern diagram

Implementation
Creating Component interface:
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}Component class
This class component could’ve been
interface. However, in this case, we are assuming that this abstract class was given to us, and we want to extend functionality without having to modify the existing code.
Creating a Decorator interface:
public abstract class CondimentDecorator extends Beverage {
Beverage beverage;
public abstract String getDescription();
}Creating a Concrete Component :
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost() {
return 1.99;
}
}Creating a Concrete Decorator:
public class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return beverage.cost() + .20;
}
}Testing:
public class StarbuzzCoffee {
public static void main(String args[]) {
Beverage beverage = new Espresso();
beverage = new Mocha(beverage);
beverage = new Whip(beverage)
System.out.println(beverage.getDescription() + " $" + beverage.cost());
}
}