侧边栏壁纸
博主头像
Haenu的Blog 博主等级

坚持学习,慢慢进步!

  • 累计撰写 35 篇文章
  • 累计创建 10 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

责任链设计模式

Haenu
2024-08-25 / 0 评论 / 0 点赞 / 32 阅读 / 0 字

什么是责任链

责任链设计模式是一种行为型设计模式,其主要目的是解耦请求发送者和请求接收者,让多个对象都有机会处理请求,从而避免请求发送者和接收者之间的紧耦合。

责任链模式的核心是一个链式结构,链中每个节点代表一个处理者对象,请求先经过第一个节点处理,如果该节点能够处理请求,则直接返回处理结果;否则,请求继续往下一个节点传递,直到找到能够处理该请求的节点为止。整个过程类似于流水线上的多个工作站,每个工作站负责一项工作,如果自己处理不了,就将工作交给下一个工作站,直到整个工作完成。

在责任链模式中,每个处理者对象都有一个指向下一个处理者对象的引用,这样就形成了一个处理者链。请求发送者只需要将请求发送给第一个节点即可,而不用关心请求会被哪个处理者对象处理。由于每个处理者对象都有机会处理请求,因此责任链模式可以实现请求的动态分配。

优缺点

责任链模式的优点在于,它可以动态地添加、删除和调整处理者对象,从而灵活地构建处理链。同时,它也避免了请求发送者和接收者之间的紧耦合,增强了系统的灵活性和可扩展性。

不过,责任链模式也有一定的缺点,例如如果处理链过长或者处理时间过长,可能会对系统性能产生一定的影响。

实战

下单前的前置校验

真实电商场景中,验证逻辑绝对不仅仅是这些,过之而无不及。

对于完成这些前置校验逻辑,大部分程序员可能的代码思路如下:在电商系统下单接口中,前置校验是非常重要的环节。下面是一个可能的校验步骤列表:

●检查商品信息是否存在,包括商品名称、价格、规格等信息。
●检查购买数量是否合法,是否超出了最大购买数量或最小购买数量的限制。
●检查商品库存是否充足,以确保库存足够满足购买者的需求。
●检查购买者的优惠券、积分等是否可以使用,以确保购买者能够享受相应的优惠或积分奖励。
●检查收货地址信息是否完整和准确,以确保商品能够顺利地送达给购买者。
●检查下单时间是否合法,例如检查购买者是否在限定的时间范围内下单。

public String createOrder(CreateOrderReqDTO xxx) {
    // 检查商品信息是否存在,包括商品名称、价格、规格等信息
  	// 检查购买数量是否合法,是否超出了最大购买数量或最小购买数量的限制
    // 检查商品库存是否充足,以确保库存足够满足购买者的需求
    // 检查购买者的优惠券、积分等是否可以使用,以确保购买者能够享受相应的优惠或积分奖励
    // 检查收货地址信息是否完整和准确,以确保商品能够顺利地送达给购买者
    // 检查下单时间是否合法,例如检查购买者是否在限定的时间范围内下单
    // ......
}

责任链

定义一个责任链处理器接口,所有子任务都实现该接口以处理具体的业务逻辑。

public interface OrderCreateChainHandler<T> extends Ordered {
  
    /**
     * 执行责任链逻辑
     *
     * @param requestParam 责任链执行入参
     */
    void handler(T requestParam);
}

创建一个责任链上下文容器,用于存储与责任链相应的子任务。

public final class OrderCreateChainContext<T> implements CommandLineRunner {
  
    private final List<OrderCreateChainHandler> orderCreateChainHandlerContainer = new ArrayList();
  
    /**
     * 责任链组件执行
     *
     * @param requestParam 请求参数
     */
    public void handler(T requestParam) {
        // 此处根据 Ordered 实际值进行排序处理
        orderCreateChainHandlerContainer.stream()
                .sorted(Comparator.comparing(Ordered::getOrder)).forEach(each -> each.handler(requestParam));
    }
  
    @Override
    public void run(String... args) throws Exception {
      	// 通过 Spring 上下文容器,获取所有 CreateOrderChainContext Bean
        Map<String, OrderCreateChainHandler> chainFilterMap = ApplicationContextHolder.getBeansOfType(OrderCreateChainHandler.class);
      	// 将对应 Bean 放入责任链上下文容器中
        chainFilterMap.forEach((beanName, bean) -> orderCreateChainHandlerContainer.add(bean););
    }
}

实现 OrderCreateChainHandler 接口作为责任链处理器,每个具体的实现类负责执行特定的逻辑。

// 订单创建参数必填检验
@Component
public final class OrderCreateParamNotNullChainHandler implements OrderCreateChainHandler<OrderCreateCommand> {
  
    @Override
    public void handler(OrderCreateCommand requestParam) {
	    // 逻辑执行
    }
  
    @Override
    public int getOrder() {
        return 0;
    }
}

// 订单创建参数正确性检验
@Component
public final class OrderCreateParamVerificationChainHandler implements OrderCreateChainHandler<OrderCreateCommand> {
  
    @Override
    public void handler(OrderCreateCommand requestParam) {
	    // 逻辑执行
    }
  
    @Override
    public int getOrder() {
        return 1;
    }
}

// 订单创建商品 SKU 库存验证
@Component
public final class OrderCreateProductSkuStockChainHandler implements OrderCreateChainHandler<OrderCreateCommand> {

    @Override
    public void handler(OrderCreateCommand requestParam) {
	    // 逻辑执行
    }
  
    @Override
    public int getOrder() {
        return 2;
    }
}

通过责任链模式优化,创建订单接口前置校验代码从上千行缩减为一行。

@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {

    private final OrderCreateChainContext<OrderCreateCommand> orderCreateChainContext;
  
    public String createOrder(OrderCreateCommand requestParam) {
        // 责任链模式: 执行订单创建参数验证
        orderCreateChainContext.handler(requestParam);
    }
}
0

评论区