如何用java写一个基于装饰者模式的餐厅点单系统
时间: 2024-01-02 16:02:16 浏览: 33
基于装饰者模式的餐厅点单系统可以分为以下几个组件:
1. 食物(Food):定义食物的名称和价格等属性,作为装饰者模式中的Component。
2. 具体食物(ConcreteFood):实现食物接口,定义具体的食物种类和价格,作为装饰者模式中的ConcreteComponent。
3. 食物装饰器(FoodDecorator):定义一个食物的装饰器,作为装饰者模式中的Decorator。
4. 具体食物装饰器(ConcreteFoodDecorator):实现食物装饰器接口,定义具体的装饰方式和价格,作为装饰者模式中的ConcreteDecorator。
5. 菜单(Menu):定义一个菜单,包含所有的食物和装饰器,提供点单和计算价格等方法。
下面是一个基于装饰者模式的餐厅点单系统的Java代码示例:
Food.java
```java
public interface Food {
String getName();
double getPrice();
}
```
ConcreteFood.java
```java
public class ConcreteFood implements Food {
private String name;
private double price;
public ConcreteFood(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String getName() {
return name;
}
@Override
public double getPrice() {
return price;
}
}
```
FoodDecorator.java
```java
public abstract class FoodDecorator implements Food {
protected Food food;
public FoodDecorator(Food food) {
this.food = food;
}
}
```
ConcreteFoodDecorator.java
```java
public class ConcreteFoodDecorator extends FoodDecorator {
private String name;
private double price;
public ConcreteFoodDecorator(Food food, String name, double price) {
super(food);
this.name = name;
this.price = price;
}
@Override
public String getName() {
return food.getName() + " with " + name;
}
@Override
public double getPrice() {
return food.getPrice() + price;
}
}
```
Menu.java
```java
import java.util.ArrayList;
import java.util.List;
public class Menu {
private List<Food> foods;
public Menu() {
this.foods = new ArrayList<>();
}
public void addFood(Food food) {
foods.add(food);
}
public void addFoodDecorator(Food food, String name, double price) {
foods.add(new ConcreteFoodDecorator(food, name, price));
}
public void removeFood(Food food) {
foods.remove(food);
}
public void printMenu() {
System.out.println("Menu:");
for (Food food : foods) {
System.out.println(food.getName() + " - " + food.getPrice());
}
}
public double calculatePrice() {
double price = 0;
for (Food food : foods) {
price += food.getPrice();
}
return price;
}
}
```
使用示例:
```java
public class Main {
public static void main(String[] args) {
// 创建菜单
Menu menu = new Menu();
// 添加食物
Food rice = new ConcreteFood("Rice", 10.0);
Food noodles = new ConcreteFood("Noodles", 12.0);
menu.addFood(rice);
menu.addFood(noodles);
// 添加装饰器
menu.addFoodDecorator(rice, "Egg", 2.0);
menu.addFoodDecorator(noodles, "Beef", 5.0);
// 打印菜单和价格
menu.printMenu();
System.out.println("Total price: " + menu.calculatePrice());
}
}
```
输出:
```
Menu:
Rice with Egg - 12.0
Noodles with Beef - 17.0
Total price: 29.0
```
在上面的示例中,我们创建了一个菜单,添加了两种食物(米饭和面条),并使用装饰器为它们添加了鸡蛋和牛肉等配料。最后,我们打印了菜单和总价。