某家咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用
某家咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用,咖啡店所供应的咖啡机配料的种类和价格如下表所示:
咖啡 价格/杯(元) 配料 价格/份(元)
蓝山咖啡(BlueCoffee) 8 牛奶(Milk) 2
拿铁咖啡(NatieCoffee) 10 橙汁(Orange) 3
试用装饰者模式为该咖啡店设计一个程序以实现计算费用的功能,输出每种饮料的详细信息描述及花费。要求绘制类图并使用Java语言模拟实现。
uml类图:
抽象类
package com.packag.zheng; public abstract class Component { //定义抽象类 public abstract String getDescription(); //实现不同咖啡和装饰者 public abstract double cost(); //实现价格计算的业务 }
AI 代码解读
需要装饰的具体类
package com.packag.zheng; public class BlueCoffee extends Component { @Override public String getDescription() { return "蓝山咖啡"; // 描述咖啡类型 } @Override public double cost() { return 8; // 描述价格 } }
AI 代码解读
package com.packag.zheng; public class NatieCoffee extends Component { @Override public String getDescription() { // 名称 return "拿铁咖啡"; } @Override public double cost() { // 价格 return 10; } }
AI 代码解读
抽象装饰组件
package com.packag.zheng; public abstract class ComponentDecrator extends Component{ public abstract String getDescription(); //抽象装饰的内容 }
AI 代码解读
装饰构件
package com.packag.zheng; public class Milk extends ComponentDecrator { Component type; // 抽象构件对象 // 构造方法 public Milk(Component type) { this.type = type; } @Override public double cost() { return 2 + type.cost(); // 牛奶价格加上具体构件的价格 } @Override public String getDescription() { return "牛奶" + type.getDescription(); // 加上配料牛奶后的描述 } }
AI 代码解读
package com.packag.zheng; //橘子汁充当具体装饰类 public class Orange extends ComponentDecrator { Component type; // 抽象构件对象 // 构造方法 public Orange(Component type) { this.type = type; } @Override public String getDescription() { // TODO 自动生成的方法存根 return "橘子汁" + type.getDescription(); } @Override public double cost() { // TODO 自动生成的方法存根 return type.cost() + 3; } }
AI 代码解读
测试端
package com.packag.zheng; public class Client { public static void main(String[] args) { // TODO 自动生成的方法存根 Component com1,com2,com3;//抽象构件独 com1=new BlueCoffee();//子类实例化对象,具体构件蓝山咖啡 com1=new Milk(com1); //添加装饰类购件 System.out.println("加了"+com1.getDescription()+"的价格:"+com1.cost()+"元"); com2=new NatieCoffee(); com2=new Orange(com2); System.out.println("加了"+com2.getDescription()+"的价格:"+com2.cost()+"元"); com3=new BlueCoffee();//实例化拿铁咖啡的对象 com3=new Orange(com3);//添加构件橘子汁 com3=new Milk(com3); System.out.println("加了"+com3.getDescription()+"的价格:"+com3.cost()+"元"); } }
AI 代码解读
运行截图
优点:1、对于扩展一个对象的功能,装饰者模式比继承更加灵活。2、可以通过动态的方式来扩展一个对象的功能。3、可以对一个对象进行多次装饰。4、具体构件类与具体装饰类可以独立变化。
缺点:1、会产很很多的小对象,小对象会占用更多的系统资源,在一定程度上影响程序的性能。2、容易出错并且不容易找到出错的地方。