题目:某咖啡店售卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如下表所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xs6YisUt-1668244133595)(草率笔记/image-20221112170505470.png)]
现采用装饰器(Decorator)模式来实现计算费用的功能,得到如图所示的类图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zvuNWnvk-1668244133597)(草率笔记/image-20221112170557733.png)]
代码如下:
public (1) class Beverage {//饮料类
String description = "Unknown Beverage";
public (2) {
return description;
}
public (3);
}
public abstract class CondimentDecorator extends Beverage {//配料
(4);
}
public class DarkRoast extends Beverage {//深度烘焙咖啡
private final int DARKROAST_PRICE = 20;
public DarkRoast() {
description = "DarkRoast";
}
public int cost() {
return DARKROAST_PRICE;
}
}
public class Espresso extends Beverage {//蒸馏咖啡
private final int ESPRESSO_PRICE = 25;
public Espresso() {
description = "Espresso";
}
public int cost() {
return ESPRESSO_PRICE;
}
}
public class Mocha extends CondimentDecorator {//摩卡
private final int MOCHA_PRICE = 10;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ",Mocha";
}
public int cost() {
return MOCHA_PRICE + beverage.cost();
}
}
public class Whip extends CondimentDecorator {//奶泡
private final int WHIP_PRICE = 8;
public Whip(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", whip";
}
public int cost() {
return WHIP_PRICE + beverage.cost();
}
}
public class Test {
public static void main(String[] args) {
Beverage beverage = new DarkRoast();
beverage = new Mocha( (5) );
beverage = new Whip( (6) );
System.out.println(beverage.getDescription() + " ¥" + beverage.cost());
}
}
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IuZyuOOi-1668244133598)(草率笔记/image-20221112170420155.png)]
答案:
- abstract
- String getDescription()
- abstract int cost()
- Beverage beverage
- beverage
- beverage