Skip to content

责任链模式

什么是责任链模式?

责任链模式 是一种 行为型设计模式(Behavioral Design Pattern),它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这些对象被连接成一条链,请求沿着这条链传递,直到有一个对象处理它为止。

核心思想

将请求的发送者和接收者解耦,让多个对象都有机会处理请求

角色组成

角色说明
Handler(抽象处理者)定义处理请求的接口,通常包含一个指向下一个处理者的引用
ConcreteHandler(具体处理者)链条上的每个节点。实现处理逻辑,决定是处理请求还是转发给下一个处理者。
Client(客户端)组装链条。创建处理链,并向链头发送请求

示例:

抽象处理者

java
public interface BaseChainHandler {

    void setNextHandler(BaseChainHandler nextHandler);

    void handle(Order order);
}

具体处理者

java
public class CouponHandler implements BaseChainHandler {

    private BaseChainHandler nextHandler;

    @Override
    public void setNextHandler(BaseChainHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handle(Order order) {
        // 优惠卷逻辑处理
        List<Long> couponIds = order.getCouponIds();
        Optional.ofNullable(couponIds)
                .ifPresent(ids -> couponIds.forEach(couponId -> {
                    // 假设每个优惠卷减5元
                    order.setAmount(order.getAmount().subtract(new BigDecimal("5")));
                }));


        Optional.ofNullable(nextHandler)
                .ifPresent(handler -> handler.handle(order));
    }
}
java
public class FullDiscountHandler implements  BaseChainHandler{
    private BaseChainHandler nextHandler;

    @Override
    public void setNextHandler(BaseChainHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handle(Order order) {
        // 满减逻辑处理
        BigDecimal amount = order.getAmount();
        if(amount.compareTo(new BigDecimal("100")) >= 0) {
            // 满100元减10元
            order.setAmount(amount.subtract(new BigDecimal("10")));
        }
        Optional.ofNullable(nextHandler)
                .ifPresent(handler -> handler.handle(order));
    }
}
java
public class MemberHandler implements BaseChainHandler {

    private BaseChainHandler nextHandler;

    @Override
    public void setNextHandler(BaseChainHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handle(Order order) {
        // 判断是否为会员
        Long userId = order.getUserId();
        BigDecimal amount = order.getAmount();
        if (userId == 1L) {
            // 会员享受9折优惠
            BigDecimal multiply = amount.multiply(new BigDecimal("0.9"));
            order.setAmount(multiply);
        }
        // 继续处理下一个处理器
        Optional.ofNullable(nextHandler)
                .ifPresent(handler -> handler.handle(order));
    }
}

Client(客户端)

java
public class Client {
    public static void main(String[] args) {
        // 创建订单
        Order order = new Order();
        order.setOrderId(1L);
        order.setUserId(1L);
        order.setAmount(new BigDecimal("150"));
        order.setStatus("PENDING");

        // 创建处理链
        BaseChainHandler fullDiscountHandler = new FullDiscountHandler();
        BaseChainHandler couponHandler = new CouponHandler();
 		BaseChainHandler memberHandler = new MemberHandler();
        // 设置处理链
        fullDiscountHandler.setNextHandler(couponHandler);
        couponHandler.setNextHandler(memberHandler);
        // 开始处理订单
        fullDiscountHandler.handle(order);

        // 输出处理后的订单信息
        System.out.println("订单ID: " + order.getOrderId());
        System.out.println("用户ID: " + order.getUserId());
        System.out.println("处理后的金额: " + order.getAmount());
    }
}

流程:

FullDiscountHandler(满减处理)->CouponHandler(优惠卷处理)->MemberHandler(会员处理)
最近更新