This pattern is part of the structural design patterns and is typically used when subclassing would become too complex, or when you want to enhance the functionality of certain objects without affecting others of the same class.

Component
package lld.designpattern.behaviour.decorator; public interface Pizza { public double getPrice(); public String getDescription(); }
ConcreteComponent
package lld.designpattern.behaviour.decorator; public class BasePizza implements Pizza { @Override public double getPrice() { return 100.0; } @Override public String getDescription() { System.out.println("calling base pizza description"); return "Plain Pizza"; } }
Decorator
package lld.designpattern.behaviour.decorator; public abstract class PizzaDecorator implements Pizza { protected Pizza tempPizza; public PizzaDecorator(Pizza pizza){ this.tempPizza = pizza; } @Override public double getPrice() { return tempPizza.getPrice(); } @Override public String getDescription() { return tempPizza.getDescription(); } }
ConcreteDecorator 1
package lld.designpattern.behaviour.decorator; public class OlivesPizza extends PizzaDecorator{ public OlivesPizza(Pizza pizza) { super(pizza); } @Override public String getDescription() { System.out.println("calling olive pizza description"); return tempPizza.getDescription()+", Olive"; } @Override public double getPrice() { return super.getPrice()+40.0; } }
ConcreteDecorator 2
package lld.designpattern.behaviour.decorator; public class CheesePizza extends PizzaDecorator{ public CheesePizza(Pizza pizza) { super(pizza); } @Override public String getDescription() { return tempPizza.getDescription()+", Cheese"; } @Override public double getPrice() { return tempPizza.getPrice()+30.0; } }
Why
tempPizza is protected protected Pizza tempPizza;Ans: So that only subclass can access this variable