这篇文章介绍了责任链模式的应用:本文介绍如果自己实现一个责任链

定义请求和响应信息

简单定义请求类Request(封装一个字符串)

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

简单定义响应类Response

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

定义Filter(参数接收Request和Response)

至于为什么接收FilterChain(是为了下面filter里面能够调用FilterChain的doFilter()方法)

定义Filter接口

把Request对象和Response对象交给处理器Filter:处理器既能处理Request对象 也能处理Response对象

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

定义两个Filter实现类

public class HTMLFilter implements Filter {

    @Override
public void doFilter(Request request, Response response, FilterChain chain) {
//process the html tag <>
request.requestStr = request.requestStr.replace('<', '[')
.replace('>', ']') + "---HTMLFilter()";
chain.doFilter(request, response, chain);
response.responseStr += "---HTMLFilter()";
} }
public class SesitiveFilter implements Filter {

    @Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.requestStr = request.requestStr.replace("被就业", "就业")
.replace("敏感", "") + "---SesitiveFilter()";
chain.doFilter(request, response, chain);
response.responseStr += "---SesitiveFilter()"; } }

定义FilterChain

public class FilterChain implements Filter {
List<Filter> filters = new ArrayList<Filter>();
int index = 0; public FilterChain addFilter(Filter f) {
this.filters.add(f);
return this;
} @Override
public void doFilter(Request request, Response response, FilterChain chain) {
if(index == filters.size()) return ; Filter f = filters.get(index);
index ++;
f.doFilter(request, response, chain);
}
}

main()方法测试

public class Main {

    /**
* @param args
*/
public static void main(String[] args) {
String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";
Request request = new Request();
request.setRequestStr(msg);
Response response = new Response();
response.setResponseStr("response");
FilterChain fc = new FilterChain();
fc.addFilter(new HTMLFilter())
.addFilter(new SesitiveFilter())
; fc.doFilter(request, response, fc);
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
} }

以上代码特点是 Request的处理是正序 Response的处理时倒序:

方便大家看清步骤:这是断点执行顺序

Filter里面调用了filterChain的doFilter方法

FilterChain里面调用了filter的doFilter方法

最新文章

  1. JSF的CommandXxx组件的update用法总结
  2. TCP/IP WebSocket MQTT
  3. LeetCode H-Index II
  4. cf(#div1 B. Dreamoon and Sets)(数论)
  5. NBUT 1122 Shameimaru&#39;s Candid Camera(水)
  6. 分页控件(PageControl)的相关属性说明
  7. 《Python 学习手册4th》 第七章 字符串
  8. 推荐一个可视化的学习Git的好网站:LearnGitBranching
  9. 大数的加法运算,杭电oj-1002
  10. 再谈机器学习中的归一化方法(Normalization Method)
  11. postgrel执行VACUUM报VACUUM cannot run inside a transaction block
  12. jQuery子页面获取父页面元素并绑定事件
  13. element UI Cascader 级联选择器 编辑 修改 数组 路径 问题(转载)
  14. P1438 无聊的数列
  15. 使用swagger来编写在线api文档
  16. Reverse Words in a String leetcode java
  17. 关于UITableView的黑线条
  18. python 全局变量与局部变量
  19. Web 前端性能优化相关内容解析
  20. LINUX修改、增加IP的方法,一张网卡绑定多个IP/漂移IP【转】

热门文章

  1. JDBC的ResultSet游标转spark的DataFrame,数据类型的映射以TeraData数据库为例
  2. golang-练习3
  3. MySQL数据库INNODB 表损坏修复处理过程
  4. postgre存储过程或者视图中&quot;::&quot;双冒号是什么意思
  5. Ubuntu分区小知识与分区方案
  6. Testng报错:method-selectors?,parameter*,groups?,packages?,classes?
  7. 如何在pycharm中进入shell脚本调试代码
  8. .NET Core 构建跨平台的桌面应用
  9. DOS基础使用专题(强烈推荐)
  10. delphi 创建桌面快捷方式