- Handler(处理者): 定义一个处理请求的接口。通常包括一个处理请求的方法。它可以是抽象类或接口,也可以是具体类,具体类中包含了对请求的处理逻辑。处理者通常包含一个指向下一个处理者的引用。
- ConcreteHandler(具体处理者): 实现Handler接口的具体处理类。它负责处理请求,如果自己能够处理则处理,否则将请求传递给下一个处理者。
- Client(客户端): 创建一个请求并将其发送给处理者链中的第一个处理者,然后等待处理结果。
见代码
处理者:
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
此处只列举几个
@Component
@Slf4j
public class CheckUserPermHandler extends OrderBaseHandler {@Overridepublic void execute(OrderPipeReqVo request) {log.info("校验用户权限==>>start");log.info("校验用户权限==>>end");}@Overridepublic void setNodeName() {this.nodeName = "校验用户权限";}
}// ...
@Component
@Slf4j
public class CheckOrderReqHandler extends OrderBaseHandler {@Overridepublic void execute(OrderPipeReqVo request) {log.info("请求参数基本校验==>>start");log.info("请求参数基本校验==>>end");}@Overridepublic void setNodeName() {this.nodeName = "请求参数基本校验";}
}// ...
@Component
@Slf4j
public class CheckOrderProductHandler extends OrderBaseHandler {@Overridepublic void execute(OrderPipeReqVo request) {log.info("检验产品信息==>>start");log.info("检验产品信息==>>end");}@Overridepublic void setNodeName() {this.nodeName = "检验产品信息";}
}
责任链节点请求类
public class OrderPipeReqVo implements Serializable {private ResultVo<Object> resultVo;private Object a;private Object b;private Object c;private Object d;// 其他业务处理类
}
封装客户端
实际应用中,我们需要对责任链进行组装,以便客户端可以方便快速的调用 ,且无需重复组装.
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"); // MQreturn 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@PostConstructpublic 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("订单责任链初始化完成");}
}
调用实例
@Overridepublic 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()方法: