责任连模式
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
类型:行为类模式
类图:
我们有一个字符串String msg = ":):,<script>,敏感,被就业,网络授课";我们希望应用以下三个规则对字符串进行过滤和谐处理:
(1)将字符串中出现的"<>"符号替换成"[]"
(2)处理字符串中的敏感信息,将被就业和谐成就业
(3)将字符串中出现的":):"转换成"^V^";
字符串会依次运用这三条规则,对字符串进行处理,每个规则都有自己需要完成的责任和任务。
第一步:定义封装请求的类Request和封装处理结果响应的类Response
1 //封装请求的类Request
2 public class Request {
3 String requestStr;
4
5 public String getRequest() {
6 return requestStr;
7 }
8
9 public void setRequest(String request) {
10 this.requestStr = request;
11 }
12
13 }
1 //封装响应信息的类Response
2 public class Response {
3 String responseStr;
4
5 public String getResponse() {
6 return responseStr;
7 }
8
9 public void setResponse(String response) {
10 this.responseStr = response;
11 }
12
13 }
第二步:定义具有过滤功能的接口Filter,具体的过滤规则需要实现该接口
1 /*
2 * 定义接口Filter,具体的过滤规则需要实现这个接口,最后一个参数添加的意义是我们在Main函数中:
3 * fc.doFilter(request, response,fc);执行这一步的时候可以按照规则链条一次使用三个过滤规则对字符串进行处理
4 * 因为
5 *
6 */
7 public interface Filter {
8 void doFilter(Request request,Response response,FilterChain chain);
9 }
第三步:定义具体的过滤处理规则
规则一
1 package com.bjsxt.dp.filter;
2
3 //处理字符串中的HTML标记
4 public class HTMLFilter implements Filter {
5
6 public void doFilter(Request request, Response response,FilterChain chain) {
7 //将字符串中出现的"<>"符号替换成"[]"
8 request.requestStr=request.requestStr
9 .replace('<', '[').replace('>', ']')+
10 //后面添加的是便于我们观察代码执行步骤的字符串
11 "----HTMLFilter()";
12 chain.doFilter(request, response,chain);
13 response.responseStr+="---HTMLFilter()";
14 }
15
16 }
规则二
1 package com.bjsxt.dp.filter;
2
3 //定义的过滤敏感字眼的过滤规则
4 public class SensitiveFilter implements Filter{
5
6 public void doFilter(Request request, Response response,FilterChain chain) {
7 //处理字符串中的敏感信息,将被就业和谐成就业
8 request.requestStr=request.requestStr
9 .replace("被就业", "就业").replace("敏感", "")+
10 //后面添加的是便于我们观察代码执行步骤的字符串
11 " ---sensitiveFilter()";
12 chain.doFilter(request, response,chain);
13 response.responseStr+="---sensitiveFilter()";
14 }
15
16 }
规则三
1 package com.bjsxt.dp.filter;
2
3 //定义FaceFilter
4 public class FaceFilter implements Filter {
5
6 public void doFilter(Request request, Response response, FilterChain chain) {
7
8 //将字符串中出现的":):"转换成"^V^";
9 request.requestStr = request.requestStr.replace(":):", "^V^")
10 //后面添加的是便于我们观察代码执行步骤的字符串
11 + "----FaceFilter()";
12 chain.doFilter(request, response, chain);
13 response.responseStr += "---FaceFilter()";
14 }
15
16 }
第四步:定义责任链FilterChain
1 package com.bjsxt.dp.filter;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 //过滤链条
7 public class FilterChain implements Filter{
8 //用List集合来存储过滤规则
9 List<Filter> filters = new ArrayList<Filter>();
10 //用于标记规则的引用顺序
11 int index=0;
12 //往规则链条中添加规则
13 public FilterChain addFilter(Filter f) {
14 filters.add(f);
15 //代码的设计技巧:Chain链添加过滤规则结束后返回添加后的Chain,方便我们下面doFilter函数的操作
16 return this;
17 }
18 public void doFilter(Request request,Response response,FilterChain chain){
19 //index初始化为0,filters.size()为3,不会执行return操作
20 if(index==filters.size()){
21 return;
22 }
23 //每添加一个过滤规则,index自增1
24 Filter f=filters.get(index);
25 index++;
26 //根据索引值获取对应的规律规则对字符串进行处理
27 f.doFilter(request, response, chain);
28 }
29 }
第五步:测试一下我们的代码
1 package com.bjsxt.dp.filter;
2
3 /*
4 * 责任链模式:
5 * 数据消息在进入数据库之前,要被多种过滤规则进行处理,多种规则形成一种链,依次处理
6 * 给定的数据消息
7 */
8 public class Main {
9 public static void main(String args[]) {
10 //设定过滤规则,对msg字符串进行过滤处理
11 String msg = ":):,<script>,敏感,被就业,网络授课";
12 //过滤请求
13 Request request=new Request();
14 //set方法,将待处理字符串传递进去
15 request.setRequest(msg);
16 //处理过程结束,给出的响应
17 Response response=new Response();
18 //设置响应信息
19 response.setResponse("response:");
20 //FilterChain,过滤规则形成的拦截链条
21 FilterChain fc=new FilterChain();
22 //规则链条添加过滤规则,采用的是链式调用
23 fc.addFilter(new HTMLFilter())
24 .addFilter(new SensitiveFilter())
25 .addFilter(new FaceFilter());
26 //按照FilterChain的规则顺序,依次应用过滤规则
27 fc.doFilter(request, response,fc);
28 //打印请求信息
29 System.out.println(request.getRequest());
30 //打印响应信息
31 System.out.println(response.getResponse());
32 /*
33 * 处理器对数据进行处理
34 * --|----|---数据--|-----|---
35 * 规则1 规则2 规则3 规则4
36 */
37 }
38 }
运行结果:
^V^,[script],,就业,网络授课----HTMLFilter() ---sensitiveFilter()----FaceFilter()
response:---FaceFilter()---sensitiveFilter()---HTMLFilter()