责任链模式

2021-01-15  本文已影响0人  zzj0990

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
interface Filter {
    void doFilter(Request request, Response response, FilterChain chain);
}
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()";
    }
}
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;
}
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. 总结

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

上一篇 下一篇

猜你喜欢

热点阅读