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

(十六)责任链模式

作者: 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