- 相关资料
在
面向对象程式设计
里,
责任链模式
是一种
软件设计模式
,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。
- 问题描述
现实生活中,如果我们想完成一件事,可能要经过几番周折。
比如新生入学这件事。
我们刚进学校
- 有志愿者引导我们去系导员办公室。
- 导员处理完我们通知我们去找寝室管理员。
- 寝室管理员处理完我们通知我们去找收发室老大爷。
- 收发室老大爷处理完我们告诉我们完事了。
- 入住成功
他们每个有都有自己的责任(要处理的事情),也能用某种方法把自己处理不了的事情交给别人处理,像一条链子一样。
像这样的事情,我们就可以用责任链模式来处理。
太过简单的责任链模式,这里就不给大家演示Demo了
- Filter与Interceptor
其实无论是Filter,还是Interceptor都算是责任链模式的一种实现。
这种可自由组合,自由拆卸的拦截器。处理一些问题确实很方便。
下面的Demo来演示一下
public class JServlet {
public void doPost(JRequest request,JResponse response) {
System.out.println("doPost");
}
}
class JRequest{
}
class JResponse{
}
public interface JFilterChain {
void doFilter(JRequest request,JResponse response);
}
public class MyFilterChain implements JFilterChain{
private List<JFilter> filters = new LinkedList<JFilter>();
private JServlet servlet;
private int index = -1;
public JServlet getServlet() {
return servlet;
}
public void setServlet(JServlet servlet) {
this.servlet = servlet;
}
public void addFilter(JFilter filter){
this.filters.add(filter);
}
@Override
public void doFilter(JRequest request, JResponse response) {
index++;
if (index == filters.size()){
servlet.doPost(request,response);
} else {
this.filters.get(index).doFilter(request, response, this);
}
}
}
public interface JFilter {
void doFilter(JRequest request,JResponse response,JFilterChain filterChain);
}
public class Filter1 implements JFilter{
@Override
public void doFilter(JRequest request, JResponse response,
JFilterChain filterChain) {
System.out.println("1");
filterChain.doFilter(request, response);
System.out.println("-1");
}
}
class Filter2 implements JFilter{
@Override
public void doFilter(JRequest request, JResponse response,
JFilterChain filterChain) {
System.out.println("2");
filterChain.doFilter(request, response);
System.out.println("-2");
}
}
class Filter3 implements JFilter{
@Override
public void doFilter(JRequest request, JResponse response,
JFilterChain filterChain) {
System.out.println("3");
filterChain.doFilter(request, response);
System.out.println("-3");
}
}
public class JTest {
public static void main(String[] args) {
MyFilterChain fc = new MyFilterChain();
fc.addFilter(new Filter1());
fc.addFilter(new Filter2());
fc.addFilter(new Filter3());
fc.setServlet(new JServlet());
fc.doFilter(new JRequest(),new JResponse());
}
}
运行结果:
1
2
3
doPost
-3
-2
-1
2
3
doPost
-3
-2
-1