一、概述
装饰模式(Decorator),动态的给一个对象添加额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
二、UML图示
三、编程实现
该程序主要通过模拟饮料配料的功能实现。
1、饮品抽象类,其他类都继承该类。
public abstract class Drink {
public String name;
public String getDescription(){
return name;
}
public abstract double cost();
}
2、饮品实现类
2.1 咖啡
public class Coffee extends Drink {
public Coffee(){
name = "咖啡";
}
@Override
public double cost() {
return 15;
}
}
2.2 茶
public class Tea extends Drink {
public Tea(){
name = "茶";
}
@Override
public double cost() {
return 20;
}
}
3、配料抽象类
public abstract class ExtraAddings extends Drink{
public abstract String getDescription();
}
4、配料实现类
4.1 加奶
public class Milk extends ExtraAddings {
Drink drink;
public Milk(Drink drink){
this.drink = drink;
}
@Override
public String getDescription() {
return drink.getDescription()+"+牛奶";
}
public double cost(){
return 3+drink.cost();
}
}
4.2 加糖
public class Sugar extends ExtraAddings {
Drink drink;
public Sugar(Drink drink){
this.drink = drink;
}
@Override
public String getDescription() {
return drink.getDescription() + "+糖";
}
public double cost(){
return 2 + drink.cost();
}
}
5、测试类
public class Test {
public static void main(String[] args) {
Drink drink1 = new Coffee();
Drink drink2 = new Tea();
Drink addMilk = new Milk(drink1);
Drink addSugar = new Sugar(drink1);
Drink addMilk2 = new Milk(drink2);
Drink addSugar2 = new Sugar(drink2);
Drink addAll1 = new Milk(addSugar);
Drink addAll2 = new Sugar(addMilk2);
System.out.println(addMilk.getDescription()+addMilk.cost());
System.out.println(addSugar.getDescription()+addSugar.cost());
System.out.println(addMilk2.getDescription()+addMilk2.cost());
System.out.println(addSugar2.getDescription()+addSugar2.cost());
System.out.println(addAll1.getDescription()+addAll1.cost());
System.out.println(addAll2.getDescription()+addAll2.cost());
}
}
结果:
咖啡+牛奶18.0
咖啡+糖17.0
茶+牛奶23.0
茶+糖22.0
咖啡+糖+牛奶20.0
茶+牛奶+糖25.0