1、责任链模式

chain of responsibility 责任链模式

责任链,顾名思义,就是用来处理相关事务责任的一条执行链,执行链上有多个节点,每个节点都有机会(条件匹配)处理请求事务,如果某个节点处理完了就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。

例如:Java EE中的Filter 使用责任链的变重。

2、介绍

主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

优点: 1、降低耦合度。它将请求的发送者和接收者解耦。2、简化了对象。使得对象不需要知道链的结构。3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。4、增加新的请求处理类很方便。

缺点: 1、不能保证请求一定被接收。2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。3、可能不容易观察运行时的特征,有碍于除错。

使用场景: 1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。3、可动态指定一组对象处理请求。

3、示例代码

XX系统对于用户评论功能的语句分析,包含敏感词(996等)进行修改后入库。

定义Msg类

 class Msg {
     String name;
     String msg;
 
     public String getMsg() {
         return msg;
    }
 
     public void setMsg(String msg) {
         this.msg = msg;
    }
 
     @Override
     public String toString() {
         return "Msg{" +
                 "msg='" + msg + '\'' +
                 '}';
    }
 }

定义ChainData类

 class ChainData {
     boolean flag = true;
     List<String> messages=new ArrayList<>();
 
     @Override
     public String toString() {
         return "ChainData{" +
                 "messages=" + messages +
                 '}';
    }
 }

定义Filter接口

 interface Filter {
     ChainData doFilter(Msg msg, ChainData chainData);
 }

定义HtmlFilter、SensitiveFilter、FaceFilter、UrlFilter处理类

 
 class HtmlFilter implements Filter {
     @Override
     public ChainData doFilter(Msg msg, ChainData chainData) {
         String r = msg.getMsg();
         r = r.replace("<", "[");
         r = r.replace(">", "]");
         msg.setMsg(r);
         chainData.messages.add("处理html");
         return chainData;
    }
 }
 
 /**
  * 处理敏感词
  */
 class SensitiveFilter implements Filter {
     @Override
     public ChainData doFilter(Msg msg, ChainData chainData) {
         String r = msg.getMsg();
         r = r.replaceAll("996", "995"); 
        msg.setMsg(r); 
        chainData.flag = false; 
        chainData.messages.add("处理敏感词"); 
        return chainData; 
   } 
}   class FaceFilter implements Filter { 
    @Override 
    public ChainData doFilter(Msg msg, ChainData chainData) { 
        String r = msg.getMsg(); 
        r = r.replace(":)", "^v^"); 
        msg.setMsg(r); 
        chainData.messages.add("处理:)笑脸"); 
        return chainData; 
   } 
}   class UrlFilter implements Filter { 
    @Override 
    public ChainData doFilter(Msg msg, ChainData chainData) { 
        String r = msg.getMsg(); 
        r = r.replace("xxx.com", "http://xxx.com"); 
        msg.setMsg(r); 
        chainData.messages.add("处理url"); 
        return chainData; 
   } 
}

定义FilterChain类

 class FilterChain implements Filter {
     List<Filter> filters = new ArrayList<>();
 
     public FilterChain add(Filter filter) {
         filters.add(filter);
         return this;
    }
 
     public void remove(Filter filter) {
         filters.remove(filter);
    }
 
     @Override
     public ChainData doFilter(Msg msg, ChainData chainData) {
         for (Filter filter : filters) {
             filter.doFilter(msg, chainData);
             if (!chainData.flag) {
                 return chainData;
            }
        } 
        return chainData; 
   } 
}

定义ChainMain测试类

 /**
  * @author lin
  * @version 1.0
  * @date 2020-07-28 15:40
  * @Description TODO
  */
 public class ChainMain {
     public static void main(String[] args) {
         ChainData chainData = new ChainData();
 
         Msg msg = new Msg();
         msg.setMsg("大家好 :) ,<script> 欢迎访问 xxx.com. 大家都是996</script>");
 
         //原有方式:
         // 处理 msg
 //       String r = msg.getMsg();
 //       r = r.replace("<", "[");
 //       r = r.replace(">", "]");
 //       msg.setMsg(r);
 //
 //       r = r.replaceAll("996", "995"); 
//       msg.setMsg(r);           //使用责任链的方式: 
        FilterChain chain1 = new FilterChain(); 
        chain1.add(new HtmlFilter()).add(new SensitiveFilter()); 
        FilterChain chain2 = new FilterChain(); 
        chain2.add(new FaceFilter()).add(new UrlFilter());           chain1.add(chain2); 
        chain1.doFilter(msg, chainData); 
        System.out.println(chainData); 
        System.out.println(msg); 
   } 

4、小结

责任链主要重在责任分离处理,让各个节点各司其职。 责任链上的各个节点都有机会处理事务,但是也可能不会受理请求。 责任链比较长,调试时可能会比较麻烦。 责任链一般用于处理流程节点之类的实际业务场景中。 Spring拦截器链、servlet过滤器链等都采用了责任链设计模式。

责任链模式避免了请求的发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

公众号发哥讲

这是一个稍偏基础和偏技术的公众号,甚至其中包括一些可能阅读量很低的包含代码的技术文,不知道你是不是喜欢,期待你的关注。

如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈~

● 扫码关注我们

据说看到好文章不推荐的人,服务器容易宕机!

本文版权归发哥讲博客园共有,原创文章,未经允许不得转载,否则保留追究法律责任的权利。

 

14、Cahin of Responsibility 责任链 COR设计模式的更多相关文章

  1. 设计模式(一)Chain Of Responsibility责任链模式

    设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser { ...

  2. python 设计模式之 (Chain of Responsibility)责任链模式

    #写在前面 对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的.所以弄明白很重要. 等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场 #责任链模式定义 简书上一网友就把这个定义 ...

  3. 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)

      17.1.解释 概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. main(),客户 IWom ...

  4. 设计模式(13)--Chain of Responsibility(责任链模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...

  5. Chain of Responsibility 责任链模式

    简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其[下家]的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...

  6. Chain of Responsibility 责任链模式 MD

    责任链模式 简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户 ...

  7. go语言设计模式之Chain Of Responsibility(责任链)

    ChainOfResponsibility.go package ChainOfResponsibility import ( "fmt" "io" " ...

  8. Chain of Responsibility - 责任链模式

    定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合度. 案例 比方如今有一个图形界面,它包含一个应用Application类,一个主窗体Window,一个buttonButton ...

  9. 设计模式 笔记 责任链模式 chain of responsibility

    //---------------------------15/04/25---------------------------- //Chain of responsibility 责任链----- ...

随机推荐

  1. 数据库01 /Mysql初识、基本指令、数据库密码相关、创建用户及授权

    数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 目录 数据库01 /Mysql初识.基本指令.数据库密码相关.创建用户及授权 1. 数据库概述 2. 数据库管理系统/DBMS ...

  2. 机器学习实战基础(十一):sklearn中的数据预处理和特征工程(四) 数据预处理 Preprocessing & Impute 之 处理分类特征:编码与哑变量

    处理分类特征:编码与哑变量 在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的 ...

  3. Django框架11 /form组件、modelForm组件

    Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...

  4. Andriod 自动化环境搭建

    一.安装JDK,配置JDK环境    百度搜索下载就行,这里分享一个下载链接:https://pan.baidu.com/s/1snuTOAx 密码:9z8r. 下载好后点击进行安装.安装好后进行环境 ...

  5. redis入门指南(六)—— 集群

    写在前面 学习<redis入门指南>笔记,结合实践,只记录重要,明确,属于新知的相关内容. 配置集群 1.配置集群,集群解决了单点故障以及单台机器内存上限的问题,使用集群时,只需要将配置文 ...

  6. 数据结构C语言实现----出队伍操作

    1.创建一个队列时,空队列中队首和队尾相同,但不是NULL,队首后面挂的元素才是NULL 2.打印队列时,对于链队列,不能把指针加一来找到下一个数据,因为链表地址不连续,需要复制一条链表,不断往后遍历 ...

  7. IE11 CSS hack

    IE11 怎么做 CSS hack ? 很简单. @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { ...

  8. 【JVM之内存与垃圾回收篇】运行时数据区概述及线程

    运行时数据区概述及线程 前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 ...

  9. Git的自定义和特殊文件配置

    目录 备注: 知识点 自定义Git 忽略特殊文件 .gitignore忽略文件 忽略文件的原则是: 忽略文件示例 .gitignore文件查看和强制添加 备注: 本文参考于廖雪峰老师的博客Git教程. ...

  10. 正在找工作的同学看过来,zozo最新的java面试题总会,学会月薪3万起!!!

    引言 为正在找工作的同学提供些许帮助,话不多说直接上题. 关注后私信我[资料]即可免费获取! 关注后私信我[资料]即可免费获取! 关注后私信我[资料]即可免费获取! 关注后私信我[资料]即可免费获取! ...