某家咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用,咖啡店所供应的咖啡机配料的种类和价格如下表所示:
咖啡 价格/杯(元) 配料 价格/份(元)
蓝山咖啡(BlueCoffee) 8 牛奶(Milk) 2
拿铁咖啡(NatieCoffee) 10 橙汁(Orange) 3
试用装饰者模式为该咖啡店设计一个程序以实现计算费用的功能,输出每种饮料的详细信息描述及花费。要求绘制类图并使用Java语言模拟实现。
uml类图:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SO1YzNzMzYzETN3QzYyEWZyYzX3ITNwYTMzAzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
抽象类
package com.packag.zheng;
public abstract class Component { //定义抽象类
public abstract String getDescription(); //实现不同咖啡和装饰者
public abstract double cost(); //实现价格计算的业务
}
需要装饰的具体类
package com.packag.zheng;
public class BlueCoffee extends Component {
@Override
public String getDescription() {
return "蓝山咖啡"; // 描述咖啡类型
}
@Override
public double cost() {
return 8; // 描述价格
}
}
package com.packag.zheng;
public class NatieCoffee extends Component {
@Override
public String getDescription() { // 名称
return "拿铁咖啡";
}
@Override
public double cost() { // 价格
return 10;
}
}
抽象装饰组件
package com.packag.zheng;
public abstract class ComponentDecrator extends Component{
public abstract String getDescription(); //抽象装饰的内容
}
装饰构件
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(); // 加上配料牛奶后的描述
}
}
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;
}
}
测试端
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()+"元");
}
}
运行截图