请为星巴克公司的饮料销售系统编写一款收费软件。星巴克中可以提供的基础饮料有咖啡、奶茶和可乐,可以选择的配料(Condiment)有布丁(Pudding)、冰激凌(IceCream)、蓝莓(BlueBerry), 客户在订购饮料时,可以在基础饮料的基础上添加任意的配料,请使用装饰者模式设计系统,要求绘制系统类图并编写代码,在测试程序中输出一杯添加了布丁和蓝莓的奶茶的价格。
UML类图:
Java程序代码:
抽象饮料Drinks接口
public interface Drinks {
public int getPrice();
}
具体饮料咖啡类
public class Coffee implements Drinks{
public Coffee() {
System.out.println("购买了一杯咖啡(5元/杯)");
}
@Override
public int getPrice() {
return 5;//咖啡一杯5元
}
}
具体饮料奶茶类
public class Milkytea implements Drinks {
public Milkytea() {
System.out.println("购买了一杯奶茶(6元/杯)");
}
@Override
public int getPrice() {
return 6;//奶茶一杯6元
}
}
具体饮料可乐类
public class Cola implements Drinks {
public Cola() {
System.out.println("购买了一杯可乐(4元/杯)");
}
@Override
public int getPrice() {
return 4;//可乐一杯4元
}
}
抽象装饰配料类
public abstract class Condiment implements Drinks{
public abstract int getPrice();
}
具体装饰布丁类
public class Pudding extends Condiment {
private Drinks drinks;
public Pudding(Drinks drinks) {
this.drinks = drinks;
System.out.println("添加了布丁(3元/份)");
}
@Override
public int getPrice() {
return drinks.getPrice()+3;//布丁3元
}
}
具体装饰冰激凌类
public class IceCream extends Condiment {
private Drinks drinks;
public IceCream(Drinks drinks) {
this.drinks = drinks;
System.out.println("添加了冰激凌(2元/份)");
}
@Override
public int getPrice() {
return drinks.getPrice()+2;//冰激凌2元
}
}
具体装饰蓝莓类
public class BlueBerry extends Condiment {
private Drinks drinks;
public BlueBerry(Drinks drinks) {
this.drinks = drinks;
System.out.println("添加了蓝莓(1元/份)");
}
@Override
public int getPrice() {
return drinks.getPrice()+1;//蓝莓1元
}
}
Client客户端
public class Client {
public static void main(String[] args) {
Drinks milkytea = new Milkytea();
milkytea = new Pudding(milkytea);
milkytea = new BlueBerry(milkytea);
System.out.println("一杯添加了布丁和蓝莓的奶茶的价格为:" + milkytea.getPrice() + "元");
}
}