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. 数据可视化之powerBI基础(八)PowerBI的表格,你真的会用吗

    https://zhuanlan.zhihu.com/p/64413000 在PowerBI的可视化对象中,还有两个「表格」对象,表格的作用不仅可以在报表提供明细数据,还经常用来测试度量值的返回结果, ...

  2. Flask 基础组件(二):配置文件

    配置参数 flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为: { 'DEBUG': get_debug_flag(default=False), 是否开启 ...

  3. python 装饰器(四):装饰器基础(三)叠放装饰器,参数化装饰器

    叠放装饰器 示例 7-19 演示了叠放装饰器的方式:@lru_cache 应用到 @clock 装饰fibonacci 得到的结果上.在示例 7-21 中,模块中最后一个函数应用了两个 @htmliz ...

  4. PdfSharp库剪裁Pdf页面边缘空白部分

    背景 网上下载下来的Pdf格式电子书放到Kindle后由于页面太大,缩放后字常常小得看不清,因此可以通过剪裁页面边缘的空白以缩小页面,使Kindle上显示的字放大.在GitHub上星最多的C# Pdf ...

  5. 图文详解在Windows系统中安装JDK

    本文以在Windows10中安装JDK8为例进行安装,其他系统和版本都是大同小异的. 下载 进入Oracle官方网站的下载页面:https://www.oracle.com/technetwork/j ...

  6. SQL注入环境的搭建

    使用Phpstudy搭建SQL注入环境: 1.下载phpstudy安装 2.下载sql实验环境 所用环境的代码是一个印度人的开源项目平台.里面包含了基本的各种注入类型,同时又有get和post类型,以 ...

  7. 从对象到类,Java中需要知道的这些东西

    1. 对象的诞生   在平时的开发中,我们使用对象的时候,都是直接new一个临时变量然后进行各种逻辑赋值然后返回,但是你有没有想过一个对象在创建的过程中经历了什么呢,为什么创建时静态变量就已经赋完值了 ...

  8. 设计模式:interpreter模式

    理解:可以广义的理解为创造一种语言,实现该语言的解释器,然后用创造的语言编写程序 对比:如xml就是一种语言,解析xml的代码就是解释器 例子: //目标:定义4中几种命令,使用C++解析 //如下: ...

  9. vue传参方式

    //query传参,使用name跳转   this.$router.push({       name:'second',       query: {         queryId:'201808 ...

  10. Python3网络爬虫开发实战PDF高清完整版免费下载|百度云盘

    百度云盘:Python3网络爬虫开发实战高清完整版免费下载 提取码:d03u 内容简介 本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.req ...