美文网首页
责任链模式

责任链模式

作者: zzj0990 | 来源:发表于2021-01-15 00:40 被阅读0次

    1. 概念

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

    2. 适用场景

    1)当程序需要使用不同方式处理不同种类请求, 而且请求类型和顺序预先未知时, 可以使用责任链模式。
    2)当必须按顺序执行多个处理者时, 可以使用该模式。
    3)如果所需处理者及其顺序必须在运行时进行改变, 可以使用责任链模式。

    3. 示例

    一个消息发布场景,对于敏感信息的过滤,每层过滤处理不同的敏感信息。
    信息内容为:大家好:),<script>,欢迎访问 baidu.com ,大家都是996
    第一层过滤处理<> 替换为[]
    第二层过滤处理996 替换为955
    每层过滤处理,既能处理res信息,又能处理服务器rep的信息
    如:请求信息经历1,2过滤处理,响应信息经历2,1过滤处理


    屏幕快照 2021-01-14 下午11.27.28.png
    • Filter接口:
    interface Filter {
        void doFilter(Request request, Response response, FilterChain chain);
    }
    
    • HTMLFilter实现:
    class HTMLFilter implements Filter {
        @Override
        public void doFilter(Request request, Response response, FilterChain chain) {
            request.str = request.str.replaceAll("<", "[").replaceAll(">", "]") + "HTMLFilter()";
            chain.doFilter(request, response);
            response.str += "--HTMLFilter()";
        }
    }
    
    • SensitiveFilter实现:
    class SensitiveFilter implements Filter {
        @Override
        public void doFilter(Request request, Response response, FilterChain chain) {
            request.str = request.str.replaceAll("996", "955") + " SensitiveFilter()";
            chain.doFilter(request, response);
            response.str += "--SensitiveFilter()";
        }
    }
    
    • 消息:
    class Request {
        String str;
    }
    class Response {
        String str;
    }
    
    • FilterChain:
    class FilterChain {
        List<Filter> filters = new ArrayList<>();
        int index = 0;
        public FilterChain add(Filter f) {
            filters.add(f);
            return this;
        }
        public void doFilter(Request request, Response response) {
            if(index == filters.size()) return;
            Filter f = filters.get(index);
            index ++;
            // 递归思想
            f.doFilter(request, response, this);
        }
    }
    
    • 场景类:
    public static void main(String[] args) {
            Request request = new Request();
            request.str = "大家好:),<script>,欢迎访问 baidu.com ,大家都是996 ";
            Response response = new Response();
            response.str = "response";
    
            FilterChain chain = new FilterChain();
            chain.add(new HTMLFilter()).add(new SensitiveFilter());
            chain.doFilter(request, response);
            System.out.println(request.str);
            System.out.println(response.str);
    
        }
    
    • 输出结果:
    大家好:),[script],欢迎访问 baidu.com ,大家都是955 HTMLFilter() SensitiveFilter()
    response--SensitiveFilter()--HTMLFilter()
    

    4. 总结

    • 优点
      责任链模式非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。
    • 缺点
      责任链有两个非常显著的缺点:一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个非常大的问题。二是调试不很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。

    ————————————————————
    坐标帝都,白天上班族,晚上是知识的分享者
    如果读完觉得有收获的话,欢迎点赞加关注

    相关文章

      网友评论

          本文标题:责任链模式

          本文链接:https://www.haomeiwen.com/subject/nxciaktx.html