责任链模式面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。

每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。也就是说责任链决定了任务的处理上方和下方。

该模式还描述了往该处理链的末尾添加新的处理对象的方法。<wiki>

1:建立一个filte接口,用来处理客户度发送给服务器端,以及服务器端返回给客户端的消息。

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

2:可以模拟客户端,以及服务器端处理消息的类。

 package com.hone.design;
//模拟request
public class Request {
String requestStr; public String getRequestStr() {
return requestStr;
}
public void setRequestStr(String requestStr) {
this.requestStr = requestStr;
}
}
 package com.hone.design;
//模拟response类
public class Response {
String responseStr; public String getResponseStr() {
return responseStr;
}
public void setResponseStr(String responseStr) {
this.responseStr = responseStr;
}
}

3:我们假设这样一个项目,准备做一个小型的论坛性质的,那么可以用filter对消息进行处理,防止一些敏感的词汇,和一些不恰当的字符。

那么我们肯定要定义filter。

package com.hone.design;
//定义一个filter,用来过滤一些包含了html标签的消息。
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()";
}
}
 package com.hone.design;

 public class SensitiveFilter implements Filter {
//定义一个filter用来过滤一些政治敏感的词汇
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.requestStr=request.requestStr.replace("胡锦*涛", "likeqiang")
+"----SensitiveFilter";
chain.doFilter(request, response, chain);
response.responseStr +="----SensitiveFilter";
}
}

4:我们的想法是这样的,用户现在客户端发送一个消息,在client——sever的过程中,先经过HTMLfilter过滤器,在经过SensitiveFilter过滤器到达服务器端。

等待sever处理之后在经过SensitiveFilter——HTMLfilter反馈给client。整过过程的难点是:怎么处理好过滤器之间的处理关系,让filter经过类似于的方式来处理消息。

可以考虑用一个FilterChain,用过链的方式来处理filter之间的关系

 package com.hone.design;

 import java.util.ArrayList;
import java.util.List; public class FilterChain implements Filter{
List<Filter> filters=new ArrayList<Filter>();
int index = 0;  //用来处理filter之间的关系用的 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);
}
}

5:用main方法来处理消息。

 package com.hone.design;

 public class MainTest {
public static void main(String[] args) {
String msg="hello, <你好>,<我不是影帝>就是这么简单,温家宝,就是这么简单的事情";
Request request=new Request();
request.setRequestStr(msg);
Response response=new Response();
response.setResponseStr("response");
FilterChain fc=new FilterChain();
fc.addFilter(new HTMLFilter())
   .addFilter(new SensitiveFilter());
fc.doFilter(request, response, fc);
System.out.println(request.getRequestStr());
System.out.println(response.getResponseStr());
}
}

整个消息的处理过程都强调filter 的先后处理顺序。

  

最新文章

  1. RabbitMQ 消息确认机制
  2. Ubuntu下的PHP开发环境架设
  3. javascript 之原型理解
  4. 2015版Force Touch Mac Book激活三个手指拖动窗口
  5. HDU 5765 Bonds(状压DP)
  6. HDU5874
  7. Maven内置属性
  8. NoSQL数据库常见分类
  9. T4模版自动生成MSSQL实体类
  10. k8s 组件介绍__单Master集群部署
  11. Android UI开发神兵利器之Android Action Bar Style Generator
  12. 【POJ1961】period
  13. ipconfig/all详解
  14. Oracle存储过程in、out、in out 模式参数
  15. 8、Redis中sort命令详解
  16. ORACLE COMMENTON 使用
  17. 对JDK、JRE和JVM的一些浅薄理解
  18. Python--通过索引excel表将文件进行文件夹分类的脚本+读取指定目录下所有文件名的脚本
  19. 【Project Euler 8】Largest product in a series
  20. 身份认证系统(一)单WEB应用的身份认证

热门文章

  1. Java基础(十二)IO输入输出
  2. java温故而知新(8)反射机制
  3. Android源码下编译APK步骤
  4. 第1章:程序设计和C语言(C语言入门)
  5. IntelliJ IDEA快速创建属性字段的get和set方法
  6. IE的兼容性设置 X-UA-Compatible
  7. bootstrap 默认显示1899问题
  8. mvn 打包命令
  9. 记账本app(一)
  10. 设置导出的excel数据