1.装饰器模式:Decorator Pattern,允许向一个现有的对象添加新的功能,同时又不改变其结构。装饰着可以在所委托被装饰者的行为之前或者之后加上自己的行为。
2.类图:
3.代码:
public interface Drink {
public float cost();
public String getDescription();
}
public class Coffee implements Drink {
private final String description = "Coffee";
//Price
@Override
public float cost() {
return 10;
}
@Override
public String getDescription() {
return description;
}
}
public abstract class CondimentDecorator implements Drink {
private Drink decoratorDrink;
public CondimentDecorator(Drink decoratorDrink) {
this.decoratorDrink = decoratorDrink;
}
@Override
public float cost() {
return decoratorDrink.cost();
}
@Override
public String getDescription() {
return decoratorDrink.getDescription();
}
}
public class Milk extends CondimentDecorator {
public Milk(Drink decoratorDrink) {
super(decoratorDrink);
}
@Override
public float cost() {
return super.cost() + 2;
}
@Override
public String getDescription() {
return super.getDescription() + "milk";
}
}
public class Sugar extends CondimentDecorator {
public Sugar(Drink decoratorSugar) {
super(decoratorSugar);
}
@Override
public float cost() {
return super.cost() + 3;
}
@Override
public String getDescription() {
return super.getDescription() + "sugar";
}
}
public class Client {
public static void main(String[] args) {
//Coffee
Drink drink = new Coffee();
System.out.println(drink.getDescription() + ":" + drink.cost());
//Add Sugar
drink = new Sugar(drink);
System.out.println(drink.getDescription() + ":" + drink.cost());
//Add Milk
drink = new Milk(drink);
System.out.println(drink.getDescription() + ":" + drink.cost());
//Add Sugar
drink = new Sugar(drink);
System.out.println(drink.getDescription() + ":" + drink.cost());
}
}