某咖啡店卖咖啡时,可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算费用。咖啡店所供应的咖啡及配料的种类和价格如下表所示。 现采用装饰器(Decorator)模式来实现计算费用的功能,按照以上要求设计类图并编写Java源程序。
时间: 2024-02-13 19:05:31 浏览: 34
好的,根据您的需求,以下是一个简单的装饰器模式的实现,用于计算咖啡店销售咖啡的费用:
首先,我们需要定义一个基础的咖啡接口,用于表示咖啡的基本属性和价格:
```java
public interface Coffee {
double getCost(); // 获取咖啡的价格
String getDescription(); // 获取咖啡的描述
}
```
然后,我们需要实现一个具体的咖啡类,用于表示咖啡的种类和基本价格:
```java
public class Espresso implements Coffee {
@Override
public double getCost() {
return 1.99;
}
@Override
public String getDescription() {
return "Espresso";
}
}
```
接下来,我们需要定义一个装饰器抽象类,用于表示各种配料的基本属性和价格:
```java
public abstract class CoffeeDecorator implements Coffee {
protected Coffee coffee;
public CoffeeDecorator(Coffee coffee) {
this.coffee = coffee;
}
public double getCost() {
return coffee.getCost();
}
public String getDescription() {
return coffee.getDescription();
}
}
```
最后,我们可以实现各种具体的装饰器类,用于表示各种不同的配料和对应的价格:
```java
public class Milk extends CoffeeDecorator {
public Milk(Coffee coffee) {
super(coffee);
}
public double getCost() {
return coffee.getCost() + 0.5;
}
public String getDescription() {
return coffee.getDescription() + ", Milk";
}
}
public class Sugar extends CoffeeDecorator {
public Sugar(Coffee coffee) {
super(coffee);
}
public double getCost() {
return coffee.getCost() + 0.3;
}
public String getDescription() {
return coffee.getDescription() + ", Sugar";
}
}
public class Cream extends CoffeeDecorator {
public Cream(Coffee coffee) {
super(coffee);
}
public double getCost() {
return coffee.getCost() + 0.7;
}
public String getDescription() {
return coffee.getDescription() + ", Cream";
}
}
```
使用时,我们可以通过组合各种装饰器类,来实现不同种类咖啡的价格计算:
```java
Coffee coffee = new Espresso();
coffee = new Milk(coffee);
coffee = new Sugar(coffee);
System.out.println(coffee.getDescription() + ": $" + coffee.getCost());
```
输出结果为:
```
Espresso, Milk, Sugar: $2.29
```
这样,我们就使用装饰器模式实现了咖啡店计算咖啡价格的功能。