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. python 装饰器(八):装饰器基础(四)types.MethodType的作用

    1 types.MethodType的作用—添加实例方法 import types class cla(object): def __init__(self, name, age): self.nam ...

  2. python 生成器(四):生成器基础(四)标准库中的生成器函数

    os.walk 这个函数在遍历目录树的过程中产出文件名,因此递归搜索文件系统像for 循环那样简单. 用于过滤的生成器函数 模块  函数  说明 itertools  compress(it,sele ...

  3. Kubernetes部署通用手册 (支持版本1.19,1.18,1.17,1.16)

    Kubernetes平台环境规划 操作环境 rbac 划分(HA高可用双master部署实例) 本文穿插了ha 高可用部署的实例,当前章节设计的是ha部署双master 部署 内网ip 角色 安装软件 ...

  4. Hello!GitHub 好用好玩值得收藏的开源项目集合~

    这是我许久以来从各处发现的极佳开源项目,希望分享给大家~ 如果帮到你了,给我个赞好嘛 编程语言类 ️learn-go-with-tests(通过单元测试学Go) GitHub地址:https://gi ...

  5. C#数据结构与算法系列(二十二):快速排序算法(QuickSort)

    1.介绍 快速排序(QuickSort)是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数 ...

  6. OSCP Learning Notes - File Transfers(3)

    Metasploit Attack Target Server: IE8 on WinXP 1.Start the Metasploit. setoolkit 2.Select 2)Website A ...

  7. javascript原型:写一个合并后数组去掉同类项的方法

    <!DOCTYPE html> <html> <head> <title>test013_Array_prototype_unique()</ti ...

  8. docker环境部署mysql

    参考文档 docker官方:https://hub.docker.com/_/mysql/?tab=description 部署步骤 1. 拉取镜像 这里我拉取了tag为5.7的镜像 docker p ...

  9. MySQL数据库---前言

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS ...

  10. Linux文件搜索

    一.whereis及which命令 这两个命令用来搜索命令的路径(也遵循/etc/updatedb.conf配置文件的筛选规则) whereis 命令名                        ...