Key words: Class explosion, Recursive function, Deprecated function

UML

Not Good Design

Classes

Better Design

Decorator

Pseudo Code

abstract class Beverage {
  public abstract int cost();
}

abstract class AddonDecorator extends Beverage {
  public abstract int cost();
}

class Espresso extends Beverage {
  public int cost() {
    return 1;
  }
}

class Caramel extends AddonDecorator {
  Beverage beverage;
  public Caramel(Beverage b) {
    this.beverage = b;
  }
  public int cost() {
    return this.beverage.cost() + 2;
  }
} 
Beverage b = new Caramel(new Espresso());
b.cost();

Reference