责任链模式,简而言之,就是将多个操作组装成一条链路进行处理。请求在链路上传递,链路上的每一个节点就是一个处理器,每个处理器都可以对请求进行处理,或者传递给链路上的下一个处理器处理
具体来说,可以用list将方法依次装进去,一个接一个的执行
或者每个方法都指定好下一个调用的方法,调用第一个后,第一个会自动调用第二个,直到最后
第一种
定义传入参数和传出结果
class Request {
String content;
public Request(String content) {
this.content = content;
}
}
class Response {
String content;
public Response(String content) {
this.content = content;
}
}
定义链路单个节点的格式,包括参数、结果和链路本身
interface Filter {
void doFilter(Request req, Response resp, FilterChain filterChain);
}
节点继承自上面定义的节点格式
\\节点一 替换996、增加返回htmlFilter
class HTMLFilter implements Filter{
@Override
public void doFilter(Request req, Response resp, FilterChain filterChain) {
req.content = req.content.replaceAll("996", "955");
System.out.println("from HTML Filter: "+req.content);
filterChain.doFilter(req, resp);
resp.content += "---htmlFilter ";
}
}
\\节点二 替换me、增加返回bodyFilter
class BodyFilter implements Filter{
@Override
public void doFilter(Request req, Response resp, FilterChain filterChain) {
req.content=req.content.replaceAll("me","everybody");
System.out.println("from Body Filter:"+req.content);
filterChain.doFilter(req,resp);
resp.content+="--bodyFilter ";
}
}
\\节点三 替换难过、增加返回footerFilter
class FooterFilter implements Filter{
@Override
public void doFilter(Request req, Response resp, FilterChain filterChain) {
req.content = req.content.replaceAll("难过", "开心");
System.out.println("from Footer Filter: "+req.content);
filterChain.doFilter(req, resp);
resp.content += "--footerFilter ";
}
}
链路需要有插入节点的方法addFilter和执行的方法doFilter
class FilterChain {
List<Filter> filterList = new ArrayList<>();
int idx = 0;
public void addFilter(Filter filter) {
filterList.add(filter);
}
public void doFilter(Request req, Response resp) {
System.out.println(idx);
if(idx >= filterList.size()) {
return;
}
//这里去调用下一个
filterList.get(idx++).doFilter(req, resp, this);
}
}
调用
public class AddFilter {
public static void main(String[] args) {
//相当于list里挨个加节点
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new HTMLFilter());
filterChain.addFilter(new BodyFilter());
filterChain.addFilter(new FooterFilter());
Request request = new Request("996 makes me 难过");
Response response = new Response("");
//调用
filterChain.doFilter(request, response);
System.out.println("返回:"+ response.content);
}
}
最后返回的结果
0
from HTML Filter: 955 makes me 难过
1
from Body Filter:955 makes everybody 难过
2
from Footer Filter: 955 makes everybody 开心
3
返回:--footerFilter --bodyFilter ---htmlFilter
第二种
在节点中加了next
abstract class Filter2 {
protected Filter2 next;
public void next(Filter2 next){
this.next=next;
}
public abstract void doFilter(Request req, Response resp);
}
next.doFilter()的方式调用下一个方法
class HTMLFilter2 extends Filter2{
@Override
public void doFilter(Request req, Response resp) {
req.content = req.content.replaceAll("996", "955");
System.out.println("from HTML Filter: "+req.content);
next.doFilter(req, resp);
resp.content += "---htmlFilter ";
}
}
class BodyFilter2 extends Filter2{
@Override
public void doFilter(Request req, Response resp) {
req.content=req.content.replaceAll("me","everybody");
System.out.println("from Body Filter:"+req.content);
next.doFilter(req, resp);
resp.content+="--bodyFilter ";
}
}
class FooterFilter2 extends Filter2{
@Override
public void doFilter(Request req, Response resp) {
req.content = req.content.replaceAll("难过", "开心");
System.out.println("from Footer Filter: "+req.content);
resp.content += "--footerFilter ";
}
}
调用时指定好next
class AddFilter2 {
public static void main(String[] args) {
HTMLFilter2 htmlFilter2 = new HTMLFilter2();
BodyFilter2 bodyFilter2 = new BodyFilter2();
FooterFilter2 footerFilter2 = new FooterFilter2();
htmlFilter2.next(bodyFilter2);
bodyFilter2.next(footerFilter2);
Request request = new Request("996 makes me 难过");
Response response = new Response("");
htmlFilter2.doFilter(request, response);
System.out.println("返回:"+ response.content);
}
}