在图书销售时,根据不同类型的图书有不同的折扣,计算金额时必须区别对待,例如计算机类图书7折,英语类图书6折。应用策略模式,用Java改进该设计。绘制该模式的UML图。
时间: 2024-04-05 11:29:57 浏览: 3
好的,这是一个很好的问题。这里是策略模式的UML图:
![策略模式UML图](https://img-blog.csdn.net/20170331104348670?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhaGFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85)
我们可以先定义一个抽象策略类 `DiscountStrategy`,其中有一个 `calculateDiscount` 方法,它根据传入的书籍类型来计算折扣,并返回折扣金额。然后,我们可以针对不同的书籍类型(例如计算机类、英语类等)编写具体的策略类,继承自 `DiscountStrategy` 并实现 `calculateDiscount` 方法。最后,我们可以在一个上下文类 `BookSales` 中使用不同的策略类来计算不同类型书籍的折扣。
下面是Java代码实现:
```java
// 抽象策略类
interface DiscountStrategy {
double calculateDiscount(double price);
}
// 具体策略类:计算机类图书7折
class ComputerDiscount implements DiscountStrategy {
@Override
public double calculateDiscount(double price) {
return price * 0.7;
}
}
// 具体策略类:英语类图书6折
class EnglishDiscount implements DiscountStrategy {
@Override
public double calculateDiscount(double price) {
return price * 0.6;
}
}
// 上下文类
class BookSales {
private DiscountStrategy discount;
public BookSales(DiscountStrategy discount) {
this.discount = discount;
}
public void setDiscount(DiscountStrategy discount) {
this.discount = discount;
}
public double calculatePrice(double price) {
return discount.calculateDiscount(price);
}
}
```
使用时,我们可以这样调用:
```java
BookSales bookSales = new BookSales(new ComputerDiscount());
double computerPrice = bookSales.calculatePrice(100.0); // 计算计算机类图书的价格
bookSales.setDiscount(new EnglishDiscount());
double englishPrice = bookSales.calculatePrice(100.0); // 计算英语类图书的价格
```
这样,我们就可以方便地根据不同类型的图书计算折扣了。