本文共 2120 字,大约阅读时间需要 7 分钟。
装饰模式(Decorator),动态的给一个对象添加额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
该程序主要通过模拟饮料配料的功能实现。
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