(十六)责任链模式

订单的优惠券可以叠加使用,应该如何做呢


(十六)责任链模式_第1张图片
业务流程

责任链模式

一个功能处理的结果,需要传递给下一个功能对象


(十六)责任链模式_第2张图片
责任链

一个优惠券处理完成后,将结果传递给下一个优惠券处理,形成一个链表


(十六)责任链模式_第3张图片
责任链
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 products = new ArrayList<>();

    public ShoppingCart(List products){
        this.products = products;
    }

    public void setDiscount(Discount discount) {
        this.discount = discount;
    }

    //提交订单主流程
    public void submitOrder(){
        //优惠减免
        money = discount.calculate(money);
        System.out.println("优惠减免后:"+ money+"元,");

    }

总结

  • 适用于多个对象处理同一个结果的场景
  • 与策略模式一样,内部持有一个对象,策略模式是注入不同的对象,产生不同的结果,而责任链模式,是多个对象遍历处理同一个请求

你可能感兴趣的:((十六)责任链模式)