订单的优惠券可以叠加使用,应该如何做呢
业务流程
责任链模式
一个功能处理的结果,需要传递给下一个功能对象
责任链
一个优惠券处理完成后,将结果传递给下一个优惠券处理,形成一个链表
责任链
public interface Discount {
public int calculate(int money);
}
/**
* 责任链父类
*/
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);
}
}
/**
* 第二单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());
}
}
责任链父类持有下一个MultyDiscount,只要next不为空,就传递结果执行
private Discount discount;
private List<Fruit> products = new ArrayList<>();
public ShoppingCart(List<Fruit> products){
this.products = products;
}
public void setDiscount(Discount discount) {
this.discount = discount;
}
//提交订单主流程
public void submitOrder(){
//优惠减免
money = discount.calculate(money);
System.out.println("优惠减免后:"+ money+"元,");
}
总结
- 适用于多个对象处理同一个结果的场景
- 与策略模式一样,内部持有一个对象,策略模式是注入不同的对象,产生不同的结果,而责任链模式,是多个对象遍历处理同一个请求
网友评论