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 面向对象专题(十一):特殊方法 (四)__get__、__set__、__delete__ 描述符(四)描述符用法建议

    使用特性以保持简单 内置的 property 类创建的其实是覆盖型描述符,__set__ 方法和__get__ 方法都实现了,即便不定义设值方法也是如此. 特性的__set__ 方法默认抛出 Attr ...

  2. Python之介绍、基本语法、流程控制

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  3. C#-CLR note - 26线程

    开篇 async/wait的使用 static async Task Main(string[] args) { Console.WriteLine("start-- "); va ...

  4. linux中无法使用vim命令

    报:linux中  vim 不是内部指令! 解决: 1. rpm -qa | grep vim // 查看vim命令在什么软件包 出现 vim-minimal-7.4.160-4.el7.x86_64 ...

  5. android 调试的一些问题解决1

    1.系统自带的机器跑起来太卡,我想用雷电模拟器来运行.可是打开后找不到设备怎么弄? 解决办法: 步骤1:>>>运行模拟器 步骤2:>>>win + r 打开cmd ...

  6. Python Ethical Hacking - Malware Analysis(3)

    Stealing WiFi Password Saved on a Computer #!/usr/bin/env python import smtplib import subprocess im ...

  7. echarts 实战 : 图表竖着或横着是怎样判定的?

    这个问题比较简单. echarts 的图表默认是竖着的. 只要 xAxis 和 yAxis 互换,竖着的图就变成了横着的图了. 所以我们可以可以写一个xy轴互换的方法. reverseXYAxis = ...

  8. CSS3伪类 :empty

    :empty 种类:伪类选择器 版本:CSS3.0 用法:匹配每个没有子元素(包含文本)的元素. 例子: <!DOCTYPE html> <html> <head> ...

  9. Kubernetes的10个基本事实!你知道几个?k8s与Docker又有何不同?

    无论您是Kubernetes的新手还是只是想获得更多知识,这篇文章都会帮到您! Kubernetes是一个增长的趋势.近年来,K8s技术经历了从小型开源Google项目到Cloud Native Co ...

  10. Laravel 5.4 使用 Mail 发送邮件获取验证码功能(使用的配置邮箱为126邮箱)

    <?php namespace App\Modules\Liveapi\Http\Controllers\Personnel; use App\Modules\Liveapi\Http\Cont ...