设计模式之责任链模式

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

责任链模式

定义

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

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

类图

设计模式之责任链模式_第1张图片

实现

实现一个敏感词过滤。

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 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. 职责链具有复用扩展能力。在实际的项目开发中比较常用。

你可能感兴趣的:(设计模式,设计模式,责任链模式)