• 责任链模式(Chain of Responsibility Pattern)


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

    应用场景

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

    责任链模式优缺点

    优点:
    a、请求者和接受者松散耦合,请求者不关心接受者里面具体的执行流程
    b、动态组合职责,灵活的分配职责对象,也可以灵活的添加改变对象职责

    缺点:
    a、产生很多细粒度的对象:因为功能处理都分散到了单独的职责对象中,每个对象功能单一,要把整个流程处理完,需要很多的职责对象,会产生大量的细粒度职责对象。
    a、不一定能处理:需要提供默认处理,并且注意构造链的有效性。

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

    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();
    

    1)、基于工厂模式

    public static GatewayHandler getFirstGatewayHandler() {
        GatewayHandler gatewayHandler1 = new CurrentLimitHandler();
        GatewayHandler gatewayHandler2 = new BlacklistHandler();
        gatewayHandler1.setHandler(gatewayHandler2);
        GatewayHandler gatewayHandler3 = new ConversationHandler();
        gatewayHandler2.setHandler(gatewayHandler3);
        return gatewayHandler1;
    }
    

    2)、基于数据库模式

    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)
    <<<责任链模式(Chain of Responsibility Pattern)
    <<<策略模式(Strategy Pattern)
    <<<模板方法模式(Template Pattern)
    <<<外观/门面模式(Facade Pattern)
    <<<建造者模式(Builder Pattern)
    <<<适配器模式(Adapter Pattern)
    <<<原型模式(Prototype Pattern)
    <<<工厂相关模式(Factory Pattern)

  • 相关阅读:
    数据结构和算法大纲
    内存碎片产生原因及处理技术
    相关资源
    busybox hexdump 命令使用
    http协议中content-length 以及chunked编码分析
    libtool工具的使用
    音视频学习相关资源
    winpcap
    ipkg包管理
    system返回值校验
  • 原文地址:https://www.cnblogs.com/jarye/p/14057450.html
Copyright © 2020-2023  润新知