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. 数据可视化基础专题(九):Matplotlib 基础(一)坐标相关

    1.前言 图表要素如下图所示 # sphinx_gallery_thumbnail_number = 3 import matplotlib.pyplot as plt import numpy as ...

  2. linux09 /消息队列、saltstack工具

    linux09 /消息队列.saltstack工具 目录 linux09 /消息队列.saltstack工具 1. 消息队列之rabbitmq 2. 云计算 3. 远程过程调用的实现:rpc 4. s ...

  3. unity-TextAsset

    定义: 当把Text files导到unity,将会变成TextAsset. 支持的格式: .txt .html .htm .xml .bytes .json .csv .yaml .fnt 注意 不 ...

  4. C与lua交互--lua调用栈分析(2)

    0 预备知识: 至少对Lua手册C API有简单的了解.lua5.3手册中文 1  Lua虚拟机的栈,如图: 假设虚拟机的栈有n个数据: 解释: 两种解释方式: A,栈顶开始, -1 ...-n B, ...

  5. TortoiseGit 解决冲突的两种方法

    一.冲突发生原因: 用户A 有新提交 用户B 没有pull, 写新代码 ,pull , 提示有冲突   Solution: 1: stash save(把自己的代码隐藏存起来) -> 重新pul ...

  6. ES6语法——Promise对象

    一.概念 Promise是异步编程的一种解决方案(解决回调地狱的问题),是一个能够获取异步操作信息的对象.Promise的内部保存着某个未来才会结束的事件(通常是一个异步操作) 二.特点 1.Prom ...

  7. Onedrive分享型网盘搭建 - OneManager

    注册账号 部署OneManager 注册完账号后打开网址:https://heroku.com/deploy?template=https://github.com/qkqpttgf/OneManag ...

  8. [redis] -- 缓存雪崩和缓存穿透、缓存击穿问题解决方案篇

    缓存雪崩 缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉 解决方案 事前:尽量保证整个redis集群的高可用性,发现机器宕机尽快补上.选择合适的内存淘 ...

  9. Java继承之面向对象

    面向对象与面向过程: 面向对象(OOP)与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程,强调的是功能行为.面向对象,将功能封装进对象,强调具备了功能的对象. 面向对象更加强调 ...

  10. Android集成JPush(极光推送)

    目前只是简单的集成 1.在极光推送官网注册用户 2.创建应用 3.配置包名,获得APPKEY 去设置 输入应用包名 确定然后返回查看APPKEY 3.在应用中集成极光推送 用的jcenter自动集成的 ...