- 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 {
@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 = "检验产品信息";
}
}
责任链节点请求类
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"); // 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("订单责任链初始化完成");
}
}
调用实例
@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()方法: