UML
 

 
代码
 
interface Coffee {  
    String getDescription();  
    double cost();  
}  
  
class Espresso implements Coffee {  
    @Override  
    public String getDescription() {  
        return "Espresso";  
    }  
  
    @Override  
    public double cost() {  
        return 1.99;  
    }  
}  
  
abstract class CoffeeDecorator implements Coffee {  
    protected Coffee decoratedCoffee;  
  
    public CoffeeDecorator(Coffee decoratedCoffee) {  
        this.decoratedCoffee = decoratedCoffee;  
    }  
  
    @Override  
    public String getDescription() {  
        return decoratedCoffee.getDescription();  
    }  
  
    @Override  
    public double cost() {  
        return decoratedCoffee.cost();  
    }  
}  
  
class Milk extends CoffeeDecorator {  
    public Milk(Coffee decoratedCoffee) {  
        super(decoratedCoffee);  
    }  
  
    @Override  
    public String getDescription() {  
        return decoratedCoffee.getDescription() + ", Milk";  
    }  
  
    @Override  
    public double cost() {  
        return decoratedCoffee.cost() + 0.10;  
    }  
}  
  
class Sugar extends CoffeeDecorator {  
    public Sugar(Coffee decoratedCoffee) {  
        super(decoratedCoffee);  
    }  
  
    @Override  
    public String getDescription() {  
        return decoratedCoffee.getDescription() + ", Sugar";  
    }  
  
    @Override  
    public double cost() {  
        return decoratedCoffee.cost() + 0.10;  
    }  
}  
  
public class CoffeeOrder {  
    public static void main(String[] args) {  
        Coffee espresso = new Espresso();  
        Coffee espressoWithMilk = new Milk(espresso);  
        Coffee espressoWithMilkAndSugar = new Sugar(espressoWithMilk);  
  
        System.out.println(espressoWithMilkAndSugar.getDescription() + " $" + espressoWithMilkAndSugar.cost());  
    }  
}