美文网首页
(十六)责任链模式

(十六)责任链模式

作者: feiry | 来源:发表于2019-08-27 23:47 被阅读0次

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


    业务流程

    责任链模式

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


    责任链

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


    责任链
    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+"元,");
    
        }
    

    总结

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

    相关文章

      网友评论

          本文标题:(十六)责任链模式

          本文链接:https://www.haomeiwen.com/subject/viejectx.html