Profile Photo

Decorator pattern

Created on: Sep 25, 2024

The Decorator Design Pattern is a structural design pattern that allows you to add new behaviors or functionalities to objects dynamically.

public interface Coffee { String getDescription(); double cost(); }
public abstract class CoffeeDecorator implements Coffee{ protected final Coffee coffeeDecorator; public CoffeeDecorator(Coffee coffeeDecorator) { this.coffeeDecorator = coffeeDecorator; } @Override public String getDescription() { return coffeeDecorator.getDescription(); } }
public class SimpleCoffee implements Coffee{ @Override public String getDescription() { return "Simple coffee"; } @Override public double cost() { return 20; } } public class WithMilk extends CoffeeDecorator { public WithMilk(Coffee coffeeDecorator) { super(coffeeDecorator); } @Override public String getDescription() { return super.getDescription() + ", With milk"; } @Override public double cost() { return coffeeDecorator.cost() + 10; } } public class WithSugar extends CoffeeDecorator{ public WithSugar(Coffee coffeeDecorator) { super(coffeeDecorator); } @Override public String getDescription() { return coffeeDecorator.getDescription()+",With sugar"; } @Override public double cost() { return coffeeDecorator.cost()+5; } }

When to use

  1. Adding Responsibilities Dynamically
  2. Avoiding Subclass Explosion

Check full code in github