设计模式学习(十六):责任链模式

news/2024/5/19 13:44:58 标签: 设计模式, 责任链模式

设计模式学习(十六):责任链模式

作者:Grey

原文地址:

博客园:设计模式学习(十六):责任链模式

CSDN:设计模式学习(十六):责任链模式

责任链模式

责任链模式是一种行为型模式。

举例说明:有一段文本需要过滤一系列敏感字,我们可以通过责任链模式来设计这个功能,假设文本是

scripts Hell World! 996

我们有多个过滤规则,比如第一个规则是:过滤 scripts 这个关键字(实际的规则可能很复杂,目前只是举这个简单例子来说明情况)
第二个规则是:过滤 996 这个关键字

首先,将这个文本封装成一个 Msg 类,文本内容存在 content 变量中

public class Msg {
    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

然后,可以抽象一个 Filter 接口,各种过滤规则无非就是实现这个接口即可

public interface Filter {
    boolean doFilter(Msg msg);
}

过滤掉 996 这个关键字的规则:

public class SensitiveFilter implements Filter {
    @Override
    public boolean doFilter(Msg msg) {
        msg.setContent(msg.getContent().replace("996", ""));
        return true;
    }
}

过滤 scripts 的规则:

public class HTMLFilter implements Filter {
    @Override
    public boolean doFilter(Msg msg) {
        msg.setContent(msg.getContent().replace("scripts", ""));
        return true;
    }
}

主方法调用的时候,就直接 New 相应的 Filter 来处理即可:

Msg msg=new Msg();
msg.setContent("scripts Hell World! 996");
System.out.println("before filter , the content is : "+msg.getContent());
Filter html=new HTMLFilter();
Filter sensitive=new SensitiveFilter();
html.doFilter(msg);
sensitive.doFilter(msg);
System.out.println("after filter , the content is : "+msg.getContent());

不过,更为优雅的一种方式是设计一个 FilterChain ,把所有的 Filter 都加入到这个 FilterChain 里面,对于 Msg 直接去调用 FilterChain 的过滤方法即可把 FilterChain 中的所有 Filter 都执行,而且还可以很灵活指定 Filter 顺序。

import java.util.*;
public class FilterChain implements Filter {
    private List<Filter> filters = new ArrayList<>();

    public FilterChain addFilter(Filter filter) {
        filters.add(filter);
        return this;
    }

    @Override
    public boolean doFilter(Msg msg) {
        for (Filter filter : filters) {
            if (!filter.doFilter(msg)) {
                return false;
            }
        }
        return true;
    }
}

那么主方法在调用的时候,可以直接通过如下的方式:

public class Main {
    public static void main(String[] args) {
        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new HTMLFilter()).addFilter(new SensitiveFilter());
        Msg msg = new Msg();
        msg.setContent("scripts Hell World! 996");
        System.out.println("before filter , the content is : " + msg.getContent());
        filterChain.doFilter(msg);
        System.out.println("after filter , the content is : " + msg.getContent());
    }
}

上述示例的 UML 图如下

image

责任链模式应用

  • Java 中的 Servlet filter;

  • Structs,Spring MVC 中的 interceptor;

  • Dubbo 中的 Filter;

  • Netty 中的 ChannelPipeline。

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料


http://www.niftyadmin.cn/n/1647431.html

相关文章

echarts图表

转载于:https://www.cnblogs.com/xiaolucky/p/11168654.html

JavaScript使用正则表达式实现迷糊查询

用户在输入框中输入文字时,使用正则在数据区进行检索,显示出提示信息.<head><meta charset"UTF-8"><title>模糊查询</title> <style type"text/css">body{text-align:center;}#datas{display:none;}#txt{font-size:300%;wid…

设计模式学习(十七):状态模式

设计模式学习&#xff08;十七&#xff09;&#xff1a;状态模式 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;设计模式学习&#xff08;十七&#xff09;&#xff1a;状态模式 CSDN&#xff1a;设计模式学习&#xff08;十七&#xff09;&#xff1a;状…

Python学习笔记 第一天

第一章 Python入门预备部分&#xff1a;编码&#xff08;计算机术语&#xff09;编码是信息从一种形式或格式转换为另一种形式的过程&#xff0c;也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码&#xff0c;或将信息、数据转换成规定的电…

SQL优化理论基础:MySQL架构总览、查询执行流程、SQL解析顺序(转载)

前言&#xff1a;一直是想知道一条SQL语句是怎么被执行的&#xff0c;它执行的顺序是怎样的&#xff0c;然后查看总结各方资料&#xff0c;就有了下面这一篇博文了。本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识。一、MySQL架构总览&…

设计模式学习(十九):访问者模式

设计模式学习&#xff08;十九&#xff09;&#xff1a;访问者模式 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;设计模式学习&#xff08;十九&#xff09;&#xff1a;访问者模式 CSDN&#xff1a;设计模式学习&#xff08;十九&#xff09;&#xff1…

处理 MySQL 因为 SLAVE 崩溃导致需要手动跳过 GTID 的问题 | 关于 GTID

今天发生了与之前某篇博客相似的问题&#xff0c;有同学在不同步的 binlog 库中使用语句 database.table 命令对表进行 drop 导致 master 丢弃该表但是从库并未能同步到该操作。并且后续又实用 use xxxx 对该表进行增删字段&#xff0c;由于salve 并未建立此表于是 slave 崩溃的…

控制台报错: java.lang.IllegalStateException: getOutputStream() has already been called for this response.

1、错误描述Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this responseat org.apache.catalina.connector.Response.getWriter(Response.java:648)at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade…