2023-03-27
原文作者:ClarenceZero 原文地址:https://blog.csdn.net/ClarenceZero/article/details/106996361

职责链模式

定义

将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

多个处理器依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理完后传递给C,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责。职责链模式实现有多种。

类图

202303272240331161.png

实现

实现一个敏感词过滤。

1. 定义过滤算法接口

    public interface SensitiveWordFilter {
        boolean doFilter(Content content);
    }

2. 定义过滤算法实现类

    /**
     * 敏感词过滤一
     */
    public class SexyWordFilter implements SensitiveWordFilter{
        @Override
        public boolean doFilter(Content content) {
            if (content.content.contains("性")) {
                return false;
            }
            return true;
        }
    }
    /**
     * 敏感词过滤二
     */
    public class PoliticalWorldFilter implements SensitiveWordFilter{
        @Override
        public boolean doFilter(Content content) {
            if (content.content.contains("政治")) {
                return false;
            }
            return true;
        }
    }

3. 创建Filter Chain

    /**
     * 通过集合保存过滤算法
     * 暴露filter执行敏感词过滤。这只是其中的职责链的变种。
     */
    public class SenstiveWordFilterChain {
        private List<SensitiveWordFilter> filterList = new ArrayList<>();
        public void addWordFilter(SensitiveWordFilter filter) {
            this.filterList.add(filter);
        }
    
        public boolean filter(Content content) {
            for (SensitiveWordFilter sensitiveWordFilter : filterList) {
                if (!sensitiveWordFilter.doFilter(content)) {
                    return false;
                }
            }
            return true;
        }
    }

4. Main

    /**
     * 1. 职责链模式很好体现单一职责原则。业务逻辑判断 设计成独立的类,通过接口方便扩展。
     * 2. 职责链模式也体现开闭原则。如果需要新添加过滤算法,我们只需要实现Filter接口,并通过addWordFitler添加到职责链即可。其它代码不需要修改,进而提高代码的扩展性。
     */
    public class M {
        public static void main(String[] args) {
            SenstiveWordFilterChain senstiveWordFilterChain = new SenstiveWordFilterChain();
            senstiveWordFilterChain.addWordFilter(new PoliticalWorldFilter());
            senstiveWordFilterChain.addWordFilter(new SexyWordFilter());
            Content content = new Content();
            content.content = "2333";
            boolean filter = senstiveWordFilterChain.filter(content);
            if (filter) {
                System.out.println("可以正常发布");
            } else {
                System.out.println("不允许发布。因为包含敏感信息!");
            }
        }
    }

总结

  1. 职责链很好地符合单一职责原则(每个算法都是独立的实现)开闭原则(扩展算法不需要修改其他代码,只需要修改客户端代码。也可以在类中做标记,比如实现某个标记接口,然后通过Spring的Bean扫描并装载到职责链内)
  2. 职责链本意是依次处理同一个请求,用户可以自定义该请求是否需要经历所有处理器,不会中途停止; 还是说当某个处理器有能力处理请求就完成职责链对该请求的处理。
  3. 职责链具有复用扩展能力。在实际的项目开发中比较常用。
阅读全文