在上一节策略模式中,每个顾客可以选择不同的打折策略,但是通常有些顾客是符合多个打折策略的,那么如何将多个打折策略结合到一起使用呢?责任链模式提供了很好的解决方式:
首先是多个折扣的抽象类:
public abstract class MultyDiscount implements Discount {
protected MultyDiscount nextMultyDiscount;
public MultyDiscount(MultyDiscount nextMultyDiscount) {
this.nextMultyDiscount = nextMultyDiscount;
}
public int calculate(int money) {
if (this.nextMultyDiscount != null) {
return this.nextMultyDiscount.calculate(money);
}
return money;
}
}
对这个抽象类的几个具体实现类:
/**
* 满减
*/
public class FullMultyDiscount extends MultyDiscount {
public FullMultyDiscount(MultyDiscount nextMultyDiscount) {
super(nextMultyDiscount);
}
@Override
public int calculate(int money) {
if (money > 200){
System.out.println("优惠满减20元");
money = money - 20;
}
return super.calculate(money);
}
}
/**
* 假日一律减5元
*/
public class HolidayMultyDiscount extends MultyDiscount {
public HolidayMultyDiscount(MultyDiscount nextMultyDiscount) {
super(nextMultyDiscount);
}
@Override
public int calculate(int money) {
if (money > 20){
System.out.println("假日一律减5元");
money = money - 5;
}
return super.calculate(money);
}
}
/**
* 首次购
*/
public class NewerMultyDiscount extends MultyDiscount {
public NewerMultyDiscount(MultyDiscount nextMultyDiscount) {
super(nextMultyDiscount);
}
@Override
public int calculate(int money) {
if (money > 100){
System.out.println("首次购买减20元");
money = money - 30;
}
return super.calculate(money);
}
}
/**
* 第二单9折优惠
*/
public class SecondMultyDiscount extends MultyDiscount {
public SecondMultyDiscount(MultyDiscount nextMultyDiscount) {
super(nextMultyDiscount);
}
@Override
public int calculate(int money) {
System.out.println("第二单打9折");
Double balance = money * 0.9;
return super.calculate(balance.intValue());
}
}
具体调用时,需要把这个对象注入进去:
/**
* 模板方法模式
* 订单费用结算过程
*/
public class ChainCartClient {
//初始化满减优惠券
private static MultyDiscount multyDiscount = new FullMultyDiscount(null);
static {
multyDiscount = new NewerMultyDiscount(multyDiscount);
multyDiscount = new SecondMultyDiscount(multyDiscount);
multyDiscount = new HolidayMultyDiscount(multyDiscount);
}
public static void main(String[] args) {
List products = new ArrayList();
products.add(StaticFactory.getFruitApple());
products.add(StaticFactory.getFruitBanana());
products.add(StaticFactory.getFruitOrange());
ShoppingCart cart = new OtherPayShopping(products);
//注入优惠方案
cart.setDiscount(multyDiscount);
cart.submitOrder();
}
}
核心只要这里不为空,就会把几个折扣策略执行完毕: