¥ Redient 4.5 抽象类的应用场景:模板方法 模拟场景:商场经常有促销活动( Promotion ),比如618,双11等,活动通常包括两个要点,一是折扣( discount ),二是满减( reduce )。不同活动的折扣、满减会不相同。假定顾客只能同时参加一个活动(比如参加618活动就不会再参加双11活动)。 请你设计一个 POS 机程序,根据总价,计算出参加某个活动后的最终的费用。规则永不变:先计算折扣,然后在此基础上进行满减。 618:8折,满500减50 双11:7折,满1000减100 Java
时间: 2024-02-20 17:00:06 浏览: 127
可以通过抽象类和模板方法来设计这个POS机程序,具体实现如下:
1. 定义抽象类Promotion,包括折扣discount和满减reduce两个字段,以及计算最终价格的模板方法calculate(double total)。
```java
public abstract class Promotion {
protected double discount;
protected double reduce;
public abstract void setDiscount(); // 设置折扣和满减金额的方法,由子类实现
public abstract void setReduce();
public final double calculate(double total) { // 计算最终价格的模板方法
setDiscount(); // 先设置折扣和满减金额
setReduce();
double price = total * discount; // 先计算折扣后的价格
if (price >= reduce) { // 如果达到满减金额,则减去满减金额
price -= reduce;
}
return price;
}
}
```
2. 定义具体的促销活动类618和双11,继承自抽象类Promotion,实现具体的折扣和满减金额。
```java
public class Promotion618 extends Promotion {
@Override
public void setDiscount() {
this.discount = 0.8;
}
@Override
public void setReduce() {
this.reduce = 50;
}
}
public class PromotionDouble11 extends Promotion {
@Override
public void setDiscount() {
this.discount = 0.7;
}
@Override
public void setReduce() {
this.reduce = 100;
}
}
```
3. 在POS机程序中,根据用户选择的促销活动来创建具体的促销活动对象,并调用calculate方法计算最终价格。
```java
public class POS {
public static void main(String[] args) {
double total = 1000; // 总价
Promotion promotion = null;
String type = "618"; // 用户选择的促销活动类型
if ("618".equals(type)) {
promotion = new Promotion618(); // 创建618活动对象
} else if ("double11".equals(type)) {
promotion = new PromotionDouble11(); // 创建双11活动对象
}
double price = promotion.calculate(total); // 计算最终价格
System.out.println("参加" + type + "活动后的价格为:" + price);
}
}
```
这样设计的好处是,如果以后要添加新的促销活动,只需要创建一个新的子类,并实现具体的折扣和满减金额即可,不需要修改原有的代码。同时,使用模板方法模式,将计算最终价格的逻辑封装在抽象类中,使得代码更加简洁和易于维护。
阅读全文