责任量模式
1、定义
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
2、结构图
3、代码
(1)过滤器接口filter
public interface Filter {
public void doFilter(FilterChain chain);
}
(2)日志过滤器LogFilter
public class LogFilter implements Filter {
@Override
public void doFilter(FilterChain chain) {
System.out.println("-----------logfilter---in---");
chain.doFilter();
System.out.println("-----------logfilter---out---");
}
}
(3)安全过滤器SecurityFilter
public class SecurityFilter implements Filter{
@Override
public void doFilter(FilterChain chain) {
System.out.println("-----------SecurityFilter---in---");
chain.doFilter();
System.out.println("-----------SecurityFilter---out---");
}
}
(4)链FilterChain
public class FilterChain{
public FilterChain(Controller controller) {
super();
this.controller = controller;
}
private Controller controller;
private List<Filter> filterList = new ArrayList<Filter>();
private int index = -1;
public void doFilter() {
index++;
if(index < filterList.size()){
filterList.get(index).doFilter(this);
}else if(index == filterList.size()){
controller.execute();
}
}
public FilterChain addFilter(Filter filter){
filterList.add(filter);
return this;
}
public void removeFilter(Filter filter){
filterList.remove(filter);
}
}
(5)controller接口
public interface Controller {
public void execute();
}
(6)请求controller实现
public class ConcreteController implements Controller{
@Override
public void execute() {
System.out.println("执行controller请求");
}
}
(7)客户端client
public class Client {
public static void main(String[] args) {
FilterChain chain = new FilterChain(new ConcreteController());
chain.addFilter(new LogFilter()).addFilter(new SecurityFilter());
chain.doFilter();
}
}
4、总结
在责任量模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
责任链模式的主要优点在于可以降低系统的耦合度,简化对象的相互连接,同时增强给对象指派职责的灵活性,增加新的请求处理类也很方便;其主要缺点在于不能保证请求一定被接收,且对于比较长的职责链,请求的处理可能涉及到多个处理对象,系统性能将受到一定影响,而且在进行代码调试时不太方便。