行为型设计模式之--责任链模式

在上一节策略模式中,每个顾客可以选择不同的打折策略,但是通常有些顾客是符合多个打折策略的,那么如何将多个打折策略结合到一起使用呢?责任链模式提供了很好的解决方式:

首先是多个折扣的抽象类:

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<Fruit> 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();
    }
}

核心只要这里不为空,就会把几个折扣策略执行完毕:

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/107302396