设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

62 | 职责链模式(上):如何实现可灵活扩展算法的敏感信息过滤框架?

ApplicationDemo
SensitiveWordFilterChain
给敏感词打马赛克后再发布
直接禁止发布
使用数组存储处理器
使用链表存储处理器
满足开闭原则,提高代码的扩展性
应对代码的复杂性
代码示例
处理方式
支持UGC的应用中的敏感词过滤
处理器链的实现方式
多个处理器依次处理同一个请求
Chain Of Responsibility Design Pattern
客户端代码满足开闭原则的方法
职责链模式的变体
处理器链的实现方式
多个处理器依次处理同一个请求
优势
应用场景举例
原理和实现
课堂讨论
重点回顾
职责链模式
如何实现可灵活扩展算法的敏感信息过滤框架

该思维导图由 AI 生成,仅供参考

前几节课中,我们学习了模板模式、策略模式,今天,我们来学习职责链模式。这三种模式具有相同的作用:复用和扩展,在实际的项目开发中比较常用,特别是框架开发中,我们可以利用它们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展点定制化框架的功能。
今天,我们主要讲解职责链模式的原理和实现。除此之外,我还会利用职责链模式,带你实现一个可以灵活扩展算法的敏感词过滤框架。下一节课,我们会更加贴近实战,通过剖析 Servlet Filter、Spring Interceptor 来看,如何利用职责链模式实现框架中常用的过滤器、拦截器。
话不多说,让我们正式开始今天的学习吧!

职责链模式的原理和实现

职责链模式的英文翻译是 Chain Of Responsibility Design Pattern。在 GoF 的《设计模式》中,它是这么定义的:
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

职责链模式是一种能够实现可灵活扩展算法的敏感信息过滤框架的设计模式。本文深入讲解了职责链模式的原理和实现方式,重点介绍了其在框架开发中的应用。文章详细讨论了职责链模式的核心思想,即将请求的发送和接收解耦,形成一个处理器链,让多个接收对象有机会处理请求。此外,还介绍了职责链模式的变体,即请求会被所有的处理器都处理一遍的情况。通过对比不同实现方式的代码,读者可以更好地理解职责链模式的应用和优化。文章强调了职责链模式的优势,包括应对代码复杂性、满足开闭原则、提高代码的扩展性等方面。总之,本文内容深入浅出,适合开发人员快速了解职责链模式及其在框架开发中的应用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(111)

  • 最新
  • 精选
  • Mew151
    Handler类的这个成员变量: protected Handler successor = null; 是不是命名为next更好一些,看这块理解了半天

    作者回复: ������ successor后继的意思,跟next感觉差不多呀

    2020-08-05
    9
    9
  • Geek_78eadb
    UGC 的职责链实现和观察者模式太像了(如果用观察者实现,我感觉是一样的,可能没学精吧),不知道大家有没有同感!

    作者回复: 是的,你说的没错

    2020-11-24
    3
    4
  • 托尼斯威特
    handler 处理顺序有时候是有要求的. 可是责任链模式本身没有能力限制顺序. 比如chain中handler的顺序是 A -> B -> C, 这时候有人不小心修改成了 A-> C-> B , 就会造成bug. 如何防止这种bug呢?

    作者回复: 这个顺序是怎么不小心改变的呢?想不到啊。如果有顺序要求的话,建议每个handler加个order权重属性,chain按照权重大小顺序执行

    2020-07-29
    3
    1
  • 布凡
    第一段代码中的handled参数没用吧,没有赋值,然后if中一直为true,第二段才会通过doHandle来处理

    作者回复: 那只是代码示例而已。你看到我代码中的”...“了吗,这部分逻辑有可能会改变handled的值的,比如我这个handler处理完了业务逻辑,不需要继续往后继续传递了,就可以主动设置handled=true

    2020-05-13
  • 布凡
    职责链模式感觉好难理解,head 中保存A→B→C 然后tail 中保存 B→C 这个地方是怎么实现的呢?

    作者回复: 没看懂你说的tail为啥保存B->C呢

    2020-05-13
    3
  • xk_
    为什么用数组来存贮处理器会更简单呢?

    作者回复: 从代码编写上也更简单啊

    2020-04-26
  • Michael
    之前在公司做的一个关于金融日历的需求,就用到了老师说的指责链模式,一个用户有各种金融日历提醒,每个提醒逻辑不一样,通过给各个提醒服务打上注解标记,通过spring ioc容器中动态获取提醒服务对象,再利用Java中的future,并行调用,最终得到的提醒汇聚成了一个提醒列表,再通过排序规则返给前端,之前这么做了,代码复合开闭原则了,但不知道是责任链模式,老师讲了,才恍然大悟,是责任链的变体,所有链条都执行一遍。
    2020-03-25
    2
    114
  • 小晏子
    如果希望客户端代码也满足开闭原则,不修改任何代码,那么有个办法是不需要用户手动添加处理器,让框架代码能自动发现处理器,然后自动调用,要实现这个,就需要框架代码中自动发现接口实现类,可以通过注解和反射实现,然后将所有实现类都放到调用链中。这有个问题就是不够灵活,所有调用链可能都被执行,用户不能自由选择和组合处理器。
    2020-03-25
    8
    72
  • tingye
    通过配置文件配置需要的处理器,客户端代码也可以不改,通过反射动态加载
    2020-03-25
    2
    41
  • Zexho
    职责链模式和策略模式我觉得很像,本质上都可以当做 if else 的解耦行为。两者的不同主要体现判断的条件下:策略模式在传入参数的时候就可以根据参数先进行判断,然后觉得使用哪一个策略;但是职责链模式的参数是无法提前判断的,先要由链路上的函数处理。就像敏感词汇,不经过一系列的判断,是无法提前知道的。
    2020-05-13
    5
    18
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部