zoukankan      html  css  js  c++  java
  • 责任链模式

    第一、责任链模式模式定义

    客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象。这样就实现了请求者和接受者之间的解耦,并且在客户端可以实现动态的组合职责链。使编程更有灵活性。

    定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。其过程实际上是一个递归调用。

    要点主要是:

     1、有多个对象共同对一个任务进行处理。

      2、这些对象使用链式存储结构,形成一个链,每个对象知道自己的下一个对象。

      3、一个对象对任务进行处理,可以添加一些操作后将对象传递个下一个任务。也可以在此对象上结束任务的处理,并结束任务。

      4、客户端负责组装链式结构,但是客户端不需要关心最终是谁来处理了任务。

     类结构图分析:

     第二、责任链的优缺点

    优点:

    职责链模式的最主要功能就是:动态组合,请求者和接受者解耦。

    请求者和接受者松散耦合:请求者不需要知道接受者,也不需要知道如何处理。每个职责对象只负责自己的职责范围,其他的交给后继者。各个组件间完全解耦。

    动态组合职责:职责链模式会把功能分散到单独的职责对象中,然后在使用时动态的组合形成链,从而可以灵活的分配职责对象,也可以灵活的添加改变对象职责。

    缺点:

    产生很多细粒度的对象:因为功能处理都分散到了单独的职责对象中,每个对象功能单一,要把整个流程处理完,需要很多的职责对象,会产生大量的细粒度职责对象。

    不一定能处理:每个职责对象都只负责自己的部分,这样就可以出现某个请求,即使把整个链走完,都没有职责对象处理它。这就需要提供默认处理,并且注意构造链的有效性。

    第三、责任链的引用场景

    1. 多条件流程判断 权限控制
    2. ERP系统 流程审批 总经理、人事经理、项目经理
    3. Java过滤器的底层实现Filter

          比如:在Java过滤器中客户端发送请求到服务器端,过滤会经过参数过滤、session过滤、表单过滤、隐藏过滤、检测请求头过滤

     第四、代码实现

    4.1网关权限控制责任链模式

    在网关作为微服务程序的入口,拦截客户端所有的请求实现权限控制 比如先判断Api接口限流、黑名单、用户会话、参数过滤。

    Api接口限流→黑名单拦截→用户会→参数过滤

     4.2入门案例

    /**
     * 抽象角色
     */
    public abstract class GateWayHandler {
        //下一个请求
        protected  GateWayHandler nextGateWayHandler;
    
        /**
         * 处理业务
         */
        public abstract void serive();
    
        public void setGateWayHandler(GateWayHandler gateWayHandler){
            this.nextGateWayHandler = gateWayHandler;
        }
    
        /**
         * 得到下一个请求
         * @return
         */
        public void getNextHand() {
            if (this.nextGateWayHandler != null) {
                nextGateWayHandler.serive();
            }
        }
    
    }
    /**
     * 黑名单实现
     */
    public class BlacklistHandler extends GateWayHandler {
        @Override
        public void serive() {
            System.out.println("黑名单");
            //处理下一个请求
            getNextHand();
        }
    }
    
    /**
     * 会话拦击
     */
    public class ConversationHandler extends GateWayHandler {
        @Override
        public void serive() {
            System.out.println("会话拦截判断");
            //处理下一个请求
            getNextHand();
        }
    }
    /**
     * 限流
     */
    public class CurrentLimitHandler extends GateWayHandler{
    
        @Override
        public void serive() {
            System.out.println("第一关网关限流操作");
            //处理下一个请求
            getNextHand();
        }
    }
    /**
     * 工厂类
     */
    public class HandlerFactory {
    
       public static GateWayHandler getFirstGateWayHandler(){
           GateWayHandler currentLimitHandler = new CurrentLimitHandler();
           GateWayHandler blacklistHand = new BlacklistHandler();
           currentLimitHandler.setGateWayHandler(blacklistHand);
           GateWayHandler conversationHandler = new ConversationHandler();
           blacklistHand.setGateWayHandler(conversationHandler);
           return currentLimitHandler;
       }
    }
    /**
     * 测试类
     */
    public class Test001 {
    
        public static void main(String[] args) {
            GateWayHandler firstGateWayHandler = HandlerFactory.getFirstGateWayHandler();
            firstGateWayHandler.serive();
        }
    }

     

  • 相关阅读:
    AcWing 1135. 新年好 图论 枚举
    uva 10196 将军 模拟
    LeetCode 120. 三角形最小路径和 dp
    LeetCode 350. 两个数组的交集 II 哈希
    LeetCode 174. 地下城游戏 dp
    LeetCode 面试题 16.11.. 跳水板 模拟
    LeetCode 112. 路径总和 递归 树的遍历
    AcWing 1129. 热浪 spfa
    Thymeleaf Javascript 取值
    Thymeleaf Javascript 取值
  • 原文地址:https://www.cnblogs.com/cxyyh/p/11444511.html
Copyright © 2011-2022 走看看