(18)责任链设计模式

一、概念

        为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。比如生活中购物叠加使用优惠券、打折等。

将请求传给一个接收者链,由链将请求流转给目标对象

1、Calculate方法内,判断next结点不为null,则继续调用next.calculate()

2、客户端调用时,负责初始化整个责任链

PS:当出现多个对象可以处理同一个请求时,适合责任链模式

二、代码示例

实体类

/**
 * 水果接口
 */
public interface Fruit {
    Double price();
}

public class Apple implements Fruit {
    private Double price = 100D;

    @Override
    public Double price() {
        return price;
    }
}

public class Banana implements Fruit{
    private Double price = 80D;

    @Override
    public Double price() {
        return price;
    }
}

public class Orange implements Fruit {
    private Double price = 110D;

    @Override
    public Double price() {
        return price;
    }
}

折扣链

/**
 * 折扣接口
 */
public interface Discount {
    // 计算
    Double calculate(Double money);
}

/**
 * 折扣抽象接类-用于指向下一个折扣
 */
public abstract class AbstractMultiDiscount implements Discount {
    // 下一个折扣
    protected AbstractMultiDiscount nextMultiDiscount;

    public AbstractMultiDiscount(AbstractMultiDiscount nextMultiDiscount) {
        this.nextMultiDiscount = nextMultiDiscount;
    }

    @Override
    public Double calculate(Double money) {
        if (this.nextMultiDiscount != null) {
            return this.nextMultiDiscount.calculate(money);
        }
        return money;
    }
}

/**
 * 假日一律减5元
 */
public class HolidayAbstractMultiDiscount extends AbstractMultiDiscount {
    public HolidayAbstractMultiDiscount(AbstractMultiDiscount nextAbstractMultiDiscount) {
        super(nextAbstractMultiDiscount);
    }

    @Override
    public Double calculate(Double money) {
        if (money > 20){
            System.out.println("假日一律减5元");
            money = money - 5;
        }
        return super.calculate(money);
    }
}

/**
 * 第二单9折优惠
 */
public class SecondAbstractMultiDiscount extends AbstractMultiDiscount {
    public SecondAbstractMultiDiscount(AbstractMultiDiscount nextAbstractMultiDiscount) {
        super(nextAbstractMultiDiscount);
    }

    @Override
    public Double calculate(Double money) {
        System.out.println("第二单打9折");
        Double balance =  money * 0.9;

        return super.calculate(balance);
    }
}

/**
 * 新客折扣
 */
public class NewerAbstractMultiDiscount extends AbstractMultiDiscount {
    public NewerAbstractMultiDiscount(AbstractMultiDiscount nextAbstractMultiDiscount) {
        super(nextAbstractMultiDiscount);
    }

    @Override
    public Double calculate(Double money) {
        if (money > 100){
            System.out.println("首次购买减30元");
            money = money - 30;
        }
        return super.calculate(money);
    }
}

/**
 * 满减折扣
 */
public class FullAbstractMultiDiscount extends AbstractMultiDiscount {
    public FullAbstractMultiDiscount(AbstractMultiDiscount nextAbstractMultiDiscount) {
        super(nextAbstractMultiDiscount);
    }

    @Override
    public Double calculate(Double money) {
        if (money > 200){
            System.out.println("优惠满减20元");
            money = money - 20;
        }

        return super.calculate(money);
    }
}

购物车

public interface ShoppingCart {
    void setDiscount(Discount discount);

    void submitOrder();
}

@Data
public class OtherPayShopping implements ShoppingCart{
    private List<Fruit> fruits;
    private Discount discount;
    public OtherPayShopping(List<Fruit> fruits) {
        this.fruits = fruits;
    }

    @Override
    public void submitOrder() {
        Double total = fruits.stream().mapToDouble(Fruit::price).sum();
        System.out.println("总金额:" + total);
        Double calculate = discount.calculate(total);
        System.out.println("折后的金额---" + calculate);
    }
}

客户端

/**
 * 订单费用结算过程
 */
public class ChainCartClient {

    // 初始化-优惠链条,客户结算优惠顺序,节假日优惠-->第二单优惠-->新客优惠-->满减优惠
    // 满减优惠券-no.4
    private static AbstractMultiDiscount abstractMultiDiscount = new FullAbstractMultiDiscount(null);

    static {
        // 新客优惠 指向 满减优惠 no.3
        abstractMultiDiscount = new NewerAbstractMultiDiscount(abstractMultiDiscount);
        // 第二单9折优惠 指向 新客优惠 no.2
        abstractMultiDiscount = new SecondAbstractMultiDiscount(abstractMultiDiscount);
        // 节假日优惠 指向 第二单9折优惠 no.1
        abstractMultiDiscount = new HolidayAbstractMultiDiscount(abstractMultiDiscount);
    }

    public static void main(String[] args) {
        // 下订单Î
        List<Fruit> products = new ArrayList();

        products.add(new Apple());
        products.add(new Banana());
        products.add(new Orange());

        // 商品加入购物车
        ShoppingCart cart = new OtherPayShopping(products);

        // 购物车注入优惠方案链条
        cart.setDiscount(abstractMultiDiscount);
        // 提交订单,输出结算金额
        cart.submitOrder();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值