Request 类:

 package com.demo;

 public class Request {

     private String requestStr;

     public String getRequestStr() {
return requestStr;
} public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
} }

Response 类:

 package com.demo;

 public class Response {

     private String responseStr;

     public String getResponseStr() {
return responseStr;
} public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
} }

Filter 接口:

 package com.demo;

 public interface Filter {
void doFilter(Request request,Response response,FilterChain chain);
}

FilterChain 类,实现Filter接口,重写doFilter()方法,用来遍历过滤器链中所有的filter:

 package com.demo;

 import java.util.ArrayList;

 public class FilterChain implements Filter{

     //过滤器链
private ArrayList<Filter> chain = new ArrayList<Filter>(); //过滤器链的索引
int index = 0; //往过滤器链中添加过滤器
public ArrayList<Filter> add(Filter filter){
chain.add(filter);
return chain;
} /**
* 重写 doFilter方法
* 如果没有遍历完,调用特定过滤器的doFilter方法
*/
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
//如果遍历完过滤器链,则返回
if(index == this.chain.size()) return; Filter filter = this.chain.get(index);
index ++;
filter.doFilter(request, response, chain);
} }

HTMLFilter (Fiter接口的实现类):

 package com.demo;

 public class HTMLFilter implements Filter {

     @Override
public void doFilter(Request request, Response response, FilterChain chain) {
//处理过滤器该干的事情
request.setRequestStr(request.getRequestStr().replace('<', '[').replace('>', ']')
+ "---HTMLFilter()"); //跳往下一个过滤器
chain.doFilter(request, response, chain); //回调
response.setResponseStr(response.getResponseStr() + "---HTMLFilter()");
} }

SensitiveFilter (Fiter接口的实现类):

 package com.demo;

 public class SensitiveFilter implements Filter {

     @Override
public void doFilter(Request request, Response response, FilterChain chain) {
//处理过滤器该干的事情
request.setRequestStr(request.getRequestStr().replace("被就业", "就业").replace("敏感", "")
+ "---SensitiveFilter()"); //跳往下一个过滤器
chain.doFilter(request, response, chain); //回调
response.setResponseStr(response.getResponseStr() + "---SensitiveFilter()");
} }

Main 执行过滤器操作的类:

 package com.demo;

 public class Main {
public static void main(String[] args) {
//请求信息
String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿"; //实例化Request对象
Request request = new Request();
request.setRequestStr(msg); //实例化Response对象
Response response = new Response();
response.setResponseStr("response"); //过滤器链
FilterChain chain = new FilterChain();
chain.add(new HTMLFilter()).add(new SensitiveFilter()); //开始过滤
chain.doFilter(request, response, chain); //打印处理结果
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr()); }
}

思路:

  在操作类中调用过滤器链的doFilter方法后,开始遍历过滤器;

  当每执行完该过滤器的操作后马上chain.doFilter()方法跳往下一个filter,

  当然,下一个filter的操作思路也是一致的,直至所有的request做完后,过滤器链返回;

  所有的filter 接着执行doFiter之后的response操作了,而且是逆序的。这样就实现了过滤器的顺着进来,逆着出去的操作。

  如果不是很清楚,用debug模式进行调试,从main方法的doFilter开始。

代码:http://pan.baidu.com/s/1kUGVy2F 提取码:9q6z

责任链模式(ChainOfResponsibiliby、Filter)的更多相关文章

  1. 由浅入深讲解责任链模式,理解Tomcat的Filter过滤器

    本文将从简单的场景引入, 逐步优化, 最后给出具体的责任链设计模式实现. 场景引入 首先我们考虑这样一个场景: 论坛上用户要发帖子, 但是用户的想法是丰富多变的, 他们可能正常地发帖, 可能会在网页中 ...

  2. 设计模式学习笔记(十四)责任链模式实现以及在Filter中的应用

    责任链模式(Chain Of Responsibility Design Pattern),也叫做职责链,是将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求.当有请求发生时,可将请求沿着这条 ...

  3. 责任链模式/chain of responsibility/行为型模式

    职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...

  4. [工作中的设计模式]责任链模式chain

    一.模式解析 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...

  5. JAVA设计模式之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  6. Java设计模式系列之责任链模式

    责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...

  7. JavaScript责任链模式

    介绍 责任链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理 ...

  8. 设计模式(一)Chain Of Responsibility责任链模式

    设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser { ...

  9. 设计模式《JAVA与模式》之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

随机推荐

  1. react PropTypes 与 DefaultProps

    PropTypes 与 DefaultProps import React ,{ Component } from 'react'; import PropTypes from 'prop-types ...

  2. [Groovy]Groovy with Ant Task

    平时经常会用Ant来写一写脚本,但最近跨入到Groovy的时代,试着做一些改变.Groovy里集成了AntBuilder能非常方便的调用到Ant的对象模型. 现考察如下 1. Groovy里定义的属性 ...

  3. iOS如何实时查看App运行日志

    Linux下管理挂载IOS设备——libimobiledevicehttps://www.jianshu.com/p/6423610d3293https://blog.csdn.net/fengzei ...

  4. java——利用生产者消费者模式思想实现简易版handler机制

    参考教程:http://www.sohu.com/a/237792762_659256 首先说一下这里面涉及到的线程: 1.mainLooper: 这个线程可以理解为消费者线程,里面运行了一个死循环, ...

  5. CSS动态伪类选择器温故

    动态伪类选择器 伪类选择器:大家熟悉的:[:link][:visited][:hover][:active]CSS3的伪类选择器分为六种:(1)动态伪类选择器(2)目标伪类选择器(3)语言伪类选择器( ...

  6. [编程题] 小易喜欢的数列 dp

    https://www.nowcoder.com/question/next?pid=6291726&qid=112729&tid=12736753 [编程题] 小易喜欢的数列 时间限 ...

  7. CAD安装失败怎样卸载CAD 2013?错误提示某些产品无法安装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  8. 数据库mysql基础语言--各模式的含义

    1. 欢迎信息 欢迎来到 MySQL 镜像.命令以 ; 或 g 结束.你的 MySQL 连接编号为 2.服务器版本:5.1.47-社区 MySQL 社区服务器(GPL) 版权(C)2000.2010, ...

  9. 性能测试工具LoadRunner31-LR之链接mysql

    步骤: 1.建好mysql数据库并启动 2.下载libmysql.dll,放到保存脚本的文件夹下 3.编写脚本并运行 Action() { int rc; //定义状态变量,0表示成功,非0表示失败 ...

  10. 性能测试工具LoadRunner29-LR之测试java代码

    步骤: 1.安装配置JDK(注意LR11最高支持jdk1.6的版本) 2.JAR包的导入 在LR中创建java Vuser脚本并且保存,我保存的文件夹名称为lr_java 将jar包放到这个文件夹下 ...