0
点赞
收藏
分享

微信扫一扫

设计模式-责任链模式(Chain of Responsibility Pattern)

上一篇 <<<创建对象的方式汇总
下一篇 >>>策略模式(Strategy Pattern)


责任链模式:避免请求发送者与接收者耦合在一起,将多个对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

应用场景

  • ERP系统 审批流程 流程审批 总经理、人事经理、项目经理
  • 网关控制 Api接口限流、黑名单、用户会话、参数过滤、session过滤等
  • 风控系统 失信名单 信用卡是否逾期 蚂蚁信用积分等
  • 多条件流程判断,权限控制
  • java过滤器


责任链模式优缺点

责任链模式实现方式核心代码

public abstract class GatewayHandler {
    protected GatewayHandler nextGatewayHandler;
    
    public abstract void service();

    public void setHandler(GatewayHandler gatewayHandler) {
        this.nextGatewayHandler = gatewayHandler;
    }
    protected void nextService(){
         if(nextGatewayHandler!=null){
             nextGatewayHandler.service();;
         }
    }
}
@Component
public class BlacklistHandler extends GatewayHandler {
    @Override
    public void service() {
        System.out.println("黑名单拦截判断....");
        nextService();
    }
}
// 启动代码
gatewayHandlerService.getDbFirstGatewayHandler().service();
public static GatewayHandler getFirstGatewayHandler() {
    GatewayHandler gatewayHandler1 = new CurrentLimitHandler();
    GatewayHandler gatewayHandler2 = new BlacklistHandler();
    gatewayHandler1.setHandler(gatewayHandler2);
    GatewayHandler gatewayHandler3 = new ConversationHandler();
    gatewayHandler2.setHandler(gatewayHandler3);
    return gatewayHandler1;
}
public GatewayHandler getDbFirstGatewayHandler() {
    // 1.查询数据库第一个handler配置
    GatewayHandlerEntity firstGatewayHandlerEntity = gatewayHandlerMapper.getFirstGatewayHandler();
    String firstBeanHandlerId = firstGatewayHandlerEntity.getHandlerId();
    // 2.从SpringBoot容器获取第一个handler对象
    GatewayHandler firstGatewayHandler = SpringUtils.getBean(firstBeanHandlerId, GatewayHandler.class);
    // 3. 获取下一个handlerBeanId
    String nextBeanHandlerId = firstGatewayHandlerEntity.getNextHandlerId();
    // 定义临时循环遍历指针
    GatewayHandler tempNextGatewayHandler = firstGatewayHandler;
    while (!StringUtils.isEmpty(nextBeanHandlerId)) {
        // 4.从SpringBoot容器获取下一个handler对象
        GatewayHandler nextGatewayHandler = SpringUtils.getBean(nextBeanHandlerId, GatewayHandler.class);
        // 5.从数据库查询该hanlder信息
        GatewayHandlerEntity nextGatewayHandlerEntity = gatewayHandlerMapper.getByHandler(nextBeanHandlerId);
        // 6.设置下一个white循环遍历hanlderid
        nextBeanHandlerId = nextGatewayHandlerEntity.getNextHandlerId();
        tempNextGatewayHandler.setHandler(nextGatewayHandler);
        tempNextGatewayHandler = nextGatewayHandler;
    }
    this.firstGatewayHandler = firstGatewayHandler;
    return firstGatewayHandler;
}

相关文章链接:
<<<23种常用设计模式总览
<<<代理模式(Proxy Pattern)
<<<装饰模式(Decorator Pattern)
<<<观察者模式(Observer Pattern)
<<<单例模式(Singleton Pattern)
<<<策略模式(Strategy Pattern)
<<<模板方法模式(Template Pattern)
<<<外观/门面模式(Facade Pattern)
<<<建造者模式(Builder Pattern)
<<<适配器模式(Adapter Pattern)
<<<原型模式(Prototype Pattern)
<<<工厂相关模式(Factory Pattern)

举报

相关推荐

0 条评论