装饰者模式在保持原有结构不变的情况下,新建类(新增功能)去包装原有的类。
1.实体抽象类:
public interface Drink {
public float cost();
public String getDescription();
}
2.具体实例实现:
public class Coffee implements Drink {
final private String description = "coffee";
@Override
public float cost() {
return 10;
}
@Override
public String getDescription() {
return description;
}
}
3.抽象装饰类
public abstract class DrinkDecoration implements Drink {
protected Drink drinkDecorate;
public DrinkDecoration(Drink drinkDecorate) {
this.drinkDecorate = drinkDecorate;
}
public float cost() {
return drinkDecorate.cost();
}
public String getDescription() {
return drinkDecorate.getDescription();
}
}
4.装饰类子类继承
public class Milk extends DrinkDecoration{
public Milk(Drink drinkDecorate) {
super(drinkDecorate);
}
public float cost(){
return super.cost() + 2;
}
public String getDescription(){
return super.getDescription() + ",加一份牛奶";
}
}
public class Sugar extends DrinkDecoration{
public Sugar(Drink drinkDecorate) {
super(drinkDecorate);
}
public float cost(){
return super.cost() + 1;
}
public String getDescription(){
return super.getDescription() + ",加一份糖";
}
}
5.测试类
public class Demo {
public static void main(String[] args) {
Drink drink = new Coffee();
System.out.println(drink.getDescription() + ":" + drink.cost());
drink = new Milk(drink);
System.out.println(drink.getDescription() + ":" + drink.cost());
drink = new Sugar(drink);
System.out.println(drink.getDescription() + ":" + drink.cost());
drink = new Milk(drink);
System.out.println(drink.getDescription() + ":" + drink.cost());
}
}
6.测试结果
coffee:10.0
coffee,加一份牛奶:12.0
coffee,加一份牛奶,加一份糖:13.0
coffee,加一份牛奶,加一份糖,加一份牛奶:15.0