责任链模式
(Chain of Responsibility Pattern)
责任链模式相信很多人在工作中也接触过。
- javax.servlet.Filter
- struts的拦截器
- SpringMVC的拦截器
那么,接下来我们来进行更加深入的、直观的了解。
讲解重点
- 责任链示例代码
- 链条与链条之间操作示范
- 自己实现简单的链式编程
定义
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
上面的一大堆看不懂,那我们通过几个例子进行解析,看完例子相信,你可以直接用自己的话,解释什么是责任链模式
举个栗子
- 父类接口Filter
/**
* 为了实现filter链条的顺序执行依赖于上一个Filter的返回值
* 修改Filter中的doFilter的返回类型为boolean
*/
interface Filter {
boolean doFilter(Msg msg);
}
- 一系列过滤器
- 链条类
//过滤链
class FilterChain implements Filter {
List<Filter> filters = new ArrayList<>(16);
//直接返回FilterChain,再进行add时代码易读性增大(链式编程)
public FilterChain add(Filter filter) {
filters.add(filter);
return this;
}
public void remove(Filter filter) {
filters.remove(filter);
}
public boolean doFilter(Msg msg) {
for (Filter filter : filters) {
if(!filter.doFilter(msg)){
return false;
}
}
return true;
}
}
- 测试程序
public class Main {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好:); <script> ,欢迎访问 taobao.com ,大家都是996");
FilterChain filterChain = new FilterChain();
filterChain.add(new HtmlFilter()).add(new SensitiveFilter());
FilterChain filterChain2 = new FilterChain();
filterChain2.add(new EmjogFilter()).add(new UrlFilter());
/**
* 让FilterChain实现Filter接口,这个链条也可以当作是一个Filter加到别的链条上去
*/
filterChain.add(filterChain2);
filterChain.doFilter(msg);
System.out.println(msg);
}
}
- 输出
结语
测试程序中将过滤器,分别放到了两个FilterChain.
其一:演示责任链的工作流程
其二:演示链条与链条之间的处理
这样就通过责任链模式,简单的实现了过滤操作。