设计模式---责任链模式快速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()方法:

相关推荐
转世成为计算机大神3 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
小乖兽技术4 小时前
23种设计模式速记法
设计模式
小白不太白9505 小时前
设计模式之 外观模式
microsoft·设计模式·外观模式
小白不太白9505 小时前
设计模式之 原型模式
设计模式·原型模式
澄澈i5 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
小白不太白95012 小时前
设计模式之建造者模式
java·设计模式·建造者模式
菜菜-plus14 小时前
java 设计模式 模板方法模式
java·设计模式·模板方法模式
萨达大14 小时前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式
机器视觉知识推荐、就业指导16 小时前
C++设计模式:原型模式(Prototype)
c++·设计模式·原型模式
阳光开朗_大男孩儿16 小时前
组合模式和适配器模式的区别
设计模式·组合模式·适配器模式