责任链模式
责任链模式主要解决消息逐级传递问题,直到传递到可以解析此消息的处理者为止,比如java web的消息过滤器
类图:
其中FilterChain不是必须的,这里为了演示java web的Filter加入的
处理者:
public interface Filter {
public void doFilter(String request, FilterChain filterChain);
}
public class ConcreteFilter1 implements Filter {
@Override
public void doFilter(String request, FilterChain filterChain) {
System.out.println(this.getClass().getName() + ":" + request);
//如果选择调用doFilter方法,则将消息推向下一级,如果直接返回则说明此处理者就可以处理此消息
if (!request.equals("request1")) {
filterChain.doFilter(request);
}
}
}
public class ConcreteFilter2 implements Filter {
@Override
public void doFilter(String request, FilterChain filterChain) {
System.out.println(this.getClass().getName() + ":" + request);
filterChain.doFilter(request);
}
}
处理者持有者(非必须):
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class FilterChain {
private List<Filter> filters;
private Iterator<Filter> iterator;
public FilterChain() {
this.filters = new ArrayList<Filter>();
}
public void doFilter(String request) {
if (null == iterator) {
iterator = filters.iterator();
}
if (iterator.hasNext()) {
iterator.next().doFilter(request, this);
}
}
public void add(Filter filter) {
filters.add(filter);
}
}
客户端:
public class Client {
public static void main(String[] args) {
Filter filter1 = new ConcreteFilter1();
Filter filter2 = new ConcreteFilter2();
FilterChain filterChain = new FilterChain();
filterChain.add(filter1);
filterChain.add(filter2);
filterChain.doFilter("hello world!");
// filterChain.doFilter("request1");
}
}
输出:
hello world!的输出:
ConcreteFilter1:hello world!
ConcreteFilter2:hello world!
request1的输出:这里不需要ConcreteFilter2处理了
ConcreteFilter1:request1