设计模式---责任链模式快速demo

  1. Handler(处理者): 定义一个处理请求的接口。通常包括一个处理请求的方法。它可以是抽象类或接口,也可以是具体类,具体类中包含了对请求的处理逻辑。处理者通常包含一个指向下一个处理者的引用。
  2. ConcreteHandler(具体处理者): 实现Handler接口的具体处理类。它负责处理请求,如果自己能够处理则处理,否则将请求传递给下一个处理者。
  3. Client(客户端): 创建一个请求并将其发送给处理者链中的第一个处理者,然后等待处理结果。

见代码

处理者:

java 复制代码
package trade.pipe;

import trade.model.order.reqVo.OrderPipeReqVo;

public abstract class OrderBaseHandler {

    public String nodeName = "";

    public abstract void execute(OrderPipeReqVo request);

    public abstract void setNodeName();

    public String getNodeName() {
        return nodeName;
    }

}

具体处理者:

复制代码
CheckUserPermHandler // 校验用户权限
CheckOrderReqHandler // 请求参数基本校验
CheckOrderProductHandler // 检验产品信息
CheckOrderBuyerInfoHandler // 校验买家所有信息
CheckOrderSellerInfoHandler // 校验卖家基本信息
AssembleOrderBaseHandler // 封装订单基本信息
AssembleOrderTradeHandler // 封装订单交易基本信息
AssembleOrderProductHandler // 封装订单商品基本信息
AssembleOrderPriceHandler // 封装订单价格信息
AssembleOrderPayHandler // 封装付款单
AssembleOrderPayDetailHandler // 封装付款单详情
AssembleOrderInvoiceHandler // 封装订单发票基本信息
OccupiedInventoryHandler // 锁定库存
SaveOrderBaseHandler // 保存普通订单所有数据
SaveOrderSearchHandler // 保存寻车订单特别数据
SaveOrderLogHandler // 保存订单日志
OrderJobsHandler // 订单完成创建定时任务
OrderMQsHandler // MQ

此处只列举几个

java 复制代码
@Component
@Slf4j
public class CheckUserPermHandler extends OrderBaseHandler {
    @Override
    public void execute(OrderPipeReqVo request) {
        log.info("校验用户权限==>>start");

        log.info("校验用户权限==>>end");
    }


    @Override
    public void setNodeName() {
        this.nodeName = "校验用户权限";
    }
}

// ...
@Component
@Slf4j
public class CheckOrderReqHandler extends OrderBaseHandler {


    @Override
    public void execute(OrderPipeReqVo request) {
        log.info("请求参数基本校验==>>start");

        log.info("请求参数基本校验==>>end");
    }

    @Override
    public void setNodeName() {
        this.nodeName = "请求参数基本校验";
    }
}

// ...
@Component
@Slf4j
public class CheckOrderProductHandler extends OrderBaseHandler {

    @Override
    public void execute(OrderPipeReqVo request) {
        log.info("检验产品信息==>>start");
       
        log.info("检验产品信息==>>end");
    }

    @Override
    public void setNodeName() {
        this.nodeName = "检验产品信息";
    }
}

责任链节点请求类

java 复制代码
public class OrderPipeReqVo implements Serializable {

    private ResultVo<Object> resultVo;

    private Object a;
    private Object b;
    private Object c;
    private Object d;
    // 其他业务处理类
}

封装客户端

实际应用中,我们需要对责任链进行组装,以便客户端可以方便快速的调用 ,且无需重复组装.

java 复制代码
import cn.hutool.extra.spring.SpringUtil;

@Component
@Slf4j
public class OrderPipeline {

    private static Map<String, List<OrderBaseHandler>> handlersMap = new HashMap<>();

    public static List<OrderBaseHandler> getHandlersMap(String tradeType) {
        return handlersMap.get(tradeType);
    }

    // 封装A订单链点静态方法
    private static List<String> getOrderHandlers() {
        List<String> list = Lists.newArrayList();
        list.add("checkUserPermHandler"); // 校验用户权限
        list.add("checkOrderReqHandler"); // 请求参数基本校验
        list.add("checkOrderProductHandler"); // 检验产品信息
        list.add("checkOrderSellerInfoHandler"); // 校验卖家基本信息
        list.add("checkOrderBuyerInfoHandler"); // 校验买家所有信息
        list.add("assembleOrderBaseHandler"); // 封装订单基本信息
        list.add("assembleOrderTradeHandler"); // 封装订单交易基本信息
        list.add("assembleOrderProductHandler"); // 封装订单商品基本信息
        list.add("assembleOrderPriceHandler"); // 封装订单价格信息
        list.add("assembleOrderPayHandler"); // 封装付款单
        list.add("assembleOrderPayDetailHandler"); // 封装付款单详情
        list.add("assembleOrderInvoiceHandler"); // 封装订单发票基本信息
        list.add("checkOrderAssemble2ReqHandler"); // 业务封装 校验
        list.add("occupiedInventoryHandler"); // 锁定库存
        list.add("saveOrderBaseHandler"); // 保存普通订单所有数据
        list.add("saveOrderSearchHandler"); // 保存订单特别数据
        list.add("saveOrderLogHandler"); // 保存订单日志
        list.add("orderJobsHandler"); // 订单完成创建定时任务
        list.add("orderMQsHandler"); // MQ
        return list;

    }

    // 封装B订单链点静态方法
    private static List<String> getSearchOrderHandlers() {
        List<String> list = Lists.newArrayList();
        list.add("checkUserPermHandler"); // 校验用户权限
        list.add("checkOrderReqHandler"); // 请求参数基本校验
        list.add("checkOrderProductHandler"); // 检验产品信息
        list.add("checkOrderSellerInfoHandler"); // 校验卖家基本信息
        list.add("checkOrderBuyerInfoHandler"); // 校验买家所有信息
        list.add("assembleOrderBaseHandler"); // 封装订单基本信息
        list.add("assembleOrderTradeHandler"); // 封装订单交易基本信息
        list.add("assembleOrderProductHandler"); // 封装订单商品基本信息
        list.add("assembleOrderPriceHandler"); // 封装订单价格信息
        list.add("assembleOrderPayHandler"); // 封装付款单
        list.add("assembleOrderPayDetailHandler"); // 封装付款单详情
        list.add("assembleOrderInvoiceHandler"); // 封装订单发票基本信息
        list.add("assembleOrderSearchHandler"); // 封装订单信息
        list.add("checkOrderAssemble2ReqHandler"); // 业务封装 
        list.add("occupiedInventoryHandler"); // 锁定库存
        list.add("saveOrderBaseHandler"); // 保存普通订单所有数据
        list.add("saveOrderBBBHandler"); // 保存订单特别数据
        list.add("saveOrderLogHandler"); // 保存订单日志
        list.add("orderJobsHandler"); // 订单完成定时任务
        list.add("orderMQsHandler"); // MQ 无服务费 无定金 发起签约
        return list;
    }
    // ...

    // 组装订单责任链map
    @PostConstruct
    public void init() {
        log.info("开始初始化订单责任链");

        List<OrderBaseHandler> orderBaseHandlers = getOrderHandlers().stream().map(bean -> (OrderBaseHandler) SpringUtil.getBean(bean)).collect(Collectors.toList());
        orderBaseHandlers.stream().forEach(b-> System.out.print(b.getClass().getName()+"-"));
        log.info("A订单责任链组装完成");
        handlersMap.put("ORDER_A", orderBaseHandlers);

        List<OrderBaseHandler> searchOrderHandlers = getSearchOrderHandlers().stream().map(bean -> (OrderBaseHandler) SpringUtil.getBean(bean)).collect(Collectors.toList());
        searchOrderHandlers.stream().forEach(b-> System.out.print(b.getClass().getName()+"-"));
        log.info("B订单责任链组装完成");
        handlersMap.put("ORDER_B", searchOrderHandlers);

        log.info("订单责任链初始化完成");
    }
}

调用实例

java 复制代码
 @Override
    public Result<Object> test() {
        List<OrderBaseHandler> order_new = OrderPipeline.getHandlersMap("ORDER_A");
        order_new.forEach(item->{
            System.out.println(item.getClass().getName());
            item.execute(null);
        });
        System.out.println("====================================================================");
        List<OrderBaseHandler> order_search = OrderPipeline.getHandlersMap("ORDER_B");
        order_search.forEach(item->{
            System.out.println(item.getClass().getName());
            item.execute(null);
        });
        return Result.success();
    }

项目启动控制台打印:

执行test()方法:

相关推荐
触底反弹1 小时前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试
杨充1 天前
10.可测试性实战设计
设计模式·开源·代码规范
杨充1 天前
9.重构十二式的实战
设计模式·开源·代码规范
杨充1 天前
6.设计原则的全景图
设计模式·开源·全栈
杨充1 天前
2.面向对象的特性
设计模式
杨充1 天前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充1 天前
8.反模式与坏味道
设计模式·开源·代码规范
杨充1 天前
3.接口vs抽象类比较
设计模式
咖啡八杯1 天前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法