zoukankan      html  css  js  c++  java
  • 责任链模式(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)

  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/jarye/p/14057450.html
Copyright © 2011-2022 走看看