5.有一个小吃店,餐牌如下: 素面 10元 加牛肉 5元 素粉 9元 加猪肉 3元 加蛋 2元 顾客在选定粉或面的基础上,可以加任意的东西(可同时加多种东西),请用装饰模式模拟一下算账程序。
时间: 2023-06-19 17:06:01 浏览: 139
以下是装饰模式的实现代码:
```
// 菜品抽象类
abstract class Dish {
public abstract double cost(); // 计算价格
public abstract String getDescription(); // 获取描述
}
// 素面类
class PlainNoodles extends Dish {
@Override
public double cost() {
return 10;
}
@Override
public String getDescription() {
return "素面";
}
}
// 素粉类
class PlainNoodleSoup extends Dish {
@Override
public double cost() {
return 9;
}
@Override
public String getDescription() {
return "素粉";
}
}
// 加肉类
class Meat extends Dish {
private Dish dish;
public Meat(Dish dish) {
this.dish = dish;
}
@Override
public double cost() {
return dish.cost() + 5;
}
@Override
public String getDescription() {
return dish.getDescription() + "加牛肉";
}
}
// 加猪肉类
class Pork extends Dish {
private Dish dish;
public Pork(Dish dish) {
this.dish = dish;
}
@Override
public double cost() {
return dish.cost() + 3;
}
@Override
public String getDescription() {
return dish.getDescription() + "加猪肉";
}
}
// 加蛋类
class Egg extends Dish {
private Dish dish;
public Egg(Dish dish) {
this.dish = dish;
}
@Override
public double cost() {
return dish.cost() + 2;
}
@Override
public String getDescription() {
return dish.getDescription() + "加蛋";
}
}
// 菜单类
class Menu {
public static void main(String[] args) {
Dish dish = new PlainNoodles(); // 点了素面
dish = new Meat(dish); // 加牛肉
dish = new Pork(dish); // 加猪肉
dish = new Egg(dish); // 加蛋
System.out.println(dish.getDescription() + " 价格:" + dish.cost() + "元");
}
}
```
上述代码中,我们定义了一个 `Dish` 抽象类表示菜品,其中包含了计算价格和获取描述的抽象方法。然后我们定义了具体的素面和素粉类,并且分别实现了抽象方法。接着我们定义了加肉、加猪肉、加蛋的装饰类,这些装饰类都继承自 `Dish` 抽象类,并且都包含了一个菜品对象,通过构造函数传入需要装饰的菜品对象。在具体的装饰类中,我们分别实现了加肉、加猪肉、加蛋的价格和描述,并且调用了被装饰的菜品对象的价格和描述方法。最后我们在 `Menu` 类中,通过一系列的装饰,得到了最终的菜品对象,然后输出了菜品的描述和价格。