责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式

Posted by 高明 on 2020-09-12

责任链模式

Chain of Responsibility Pattern

javax.servlet.Filter

在论坛中发表文章

后台要经过信息处理才可以发表或者进入数据库

image-20210914150037944

传统过滤

1
2
3
4
5
6
7
8
9
10
public class RespoMain {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好,:),欢迎访问www.baidu.com");

msg.setMsg(msg.getMsg().replace(":)","嘻嘻"));
msg.setMsg(msg.getMsg().replace("www.baidu.com"," https://www.baidu.com"));
System.out.println(msg.getMsg());
}
}

增加Filter接口,实现doFilter方法,实现FaceFilter和HttpFilter

1
2
3
public interface Filter {
void doFilter(Msg msg);
}
1
2
3
4
5
6
public class FaceFilter implements Filter {
@Override
public void doFilter(Msg msg) {
msg.setMsg(msg.getMsg().replace(":)", "嘻嘻"));
}
}
1
2
3
4
5
6
public class HttpFilter implements Filter{
@Override
public void doFilter(Msg msg) {
msg.setMsg(msg.getMsg().replace("www.baidu.com"," https://www.baidu.com"));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
public class RespoMain {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好,:),欢迎访问www.baidu.com");

FaceFilter faceFilter = new FaceFilter();
HttpFilter httpFilter = new HttpFilter();
faceFilter.doFilter(msg);
httpFilter.doFilter(msg);
System.out.println(msg.getMsg());
}
}

多个filter过滤,可以用数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class RespoMain {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好,:),欢迎访问www.baidu.com");

List<Filter> filters = new ArrayList<>();
filters.add(new FaceFilter());
filters.add(new HttpFilter());

for (Filter filter :
filters) {
filter.doFilter(msg);
}
System.out.println(msg.getMsg());
}
}

增加filterChain,实现Filter可实现责任链链接责任链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class FilterChain implements Filter {

private List<Filter> filters = new ArrayList<>();


@Override
public void doFilter(Msg msg) {
for (Filter filter :
filters) {
filter.doFilter(msg);
}
}

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

FilterChain remove(Filter filter) {
filters.remove(filter);
return this;
}

}
1
2
3
4
5
6
7
8
9
10
11
public class RespoMain {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好,:),欢迎访问www.baidu.com");

FilterChain filterChain = new FilterChain();
filterChain.add(new FaceFilter()).add(new HttpFilter());
filterChain.doFilter(msg);
System.out.println(msg.getMsg());
}
}

责任链中断,FilterdoFilter方法返回boolean

1
2
3
public interface Filter {
boolean doFilter(Msg msg);
}
1
2
3
4
5
6
7
public class FaceFilter implements Filter {
@Override
public boolean doFilter(Msg msg) {
msg.setMsg(msg.getMsg().replace(":)", "嘻嘻"));
return false;
}
}
1
2
3
4
5
6
7
public class HttpFilter implements Filter {
@Override
public boolean doFilter(Msg msg) {
msg.setMsg(msg.getMsg().replace("www.baidu.com", " https://www.baidu.com"));
return true;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class FilterChain implements Filter {

private List<Filter> filters = new ArrayList<>();


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

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

FilterChain remove(Filter filter) {
filters.remove(filter);
return this;
}

}
1
2
3
4
5
6
7
8
9
10
11
public class RespoMain {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好,:),欢迎访问www.baidu.com");

FilterChain filterChain = new FilterChain();
filterChain.add(new FaceFilter()).add(new HttpFilter());
filterChain.doFilter(msg);
System.out.println(msg.getMsg());
}
}
1
大家好,嘻嘻,欢迎访问www.baidu.com

实现Filter

image-20210914161233452

1
2
3
4
5
6
7
8
9
10
11
public class Request {
private String info;

public String getInfo() {
return info;
}

public void setInfo(String info) {
this.info = info;
}
}
1
2
3
4
5
6
7
8
9
10
11
public class Response {
private String info;

public String getInfo() {
return info;
}

public void setInfo(String info) {
this.info = info;
}
}
1
2
3
public interface Filter {
void doFilter(Request request, Response response, FilterChain filterChain);
}
1
2
3
4
5
6
7
8
public class OneFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain filterChain) {
request.setInfo(request.getInfo() + " one filter");
filterChain.doFilter(request, response);
response.setInfo(response.getInfo() + " one filter");
}
}
1
2
3
4
5
6
7
8
public class TwoFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain filterChain) {
request.setInfo(request.getInfo() + " two filter");
filterChain.doFilter(request, response);
response.setInfo(response.getInfo() + " two filter");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FilterChain {

private List<Filter> filters = new ArrayList<>();

private Integer index = 0;

void add(Filter filter) {
filters.add(filter);
}

void remove(Filter filter) {
filters.remove(filter);
}

public void doFilter(Request request, Response response) {
if (index == filters.size()) {
return;
}
Filter filter = filters.get(index);
index++;
filter.doFilter(request, response, this);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class FilterMain {
public static void main(String[] args) {
FilterChain filterChain = new FilterChain();
filterChain.add(new OneFilter());
filterChain.add(new TwoFilter());
Request request = new Request();
request.setInfo("init request");
Response response = new Response();
response.setInfo("init response");
filterChain.doFilter(request, response);
System.out.println(request.getInfo());
System.out.println(response.getInfo());
}
}
1
2
init request one filter two filter
init response two filter one filter