责任链模式
一条请求从发送端到接受端,或者说从客户端发送到服务器,有多个对象有机会进行处理,这些对象形成一条链,依次对请求进行处理,直到一个对象对它处理完成。
举例:
邮寄包裹:从发货起到收获会经过多次的分拣和处理。
网络程序过滤(和谐):从客户端到服务器可能会经过多个过滤器过滤
申请加薪:部门经理,经理,总经理...的请示
结构图
请求从一端到一端,经过过滤器的过滤,最后达到终点
几个类
MessageProcessor
processor()持有FilterChain的引用,用来处理消息的过滤。
public class MessageProcessor {
private String msg;
private FilterChain mFilterChain;
public void setmFilterChain(FilterChain mFilterChain) {
this.mFilterChain = mFilterChain;
}
public void setMsg(String msg) {
this.msg = msg;
}
public void processor() {
mFilterChain.doFilter();
}
}
FilterChain
过滤链,持有ArrayList<Filter>链表,通过dofilter()遍历ArrayList的Filter,Filter.doFilter()执行过滤规则。
import java.util.ArrayList;
import java.util.List;
public class FilterChain {
private List<Filter> mFilter = new ArrayList<Filter>();
public FilterChain addFilter(Filter filter) {
mFilter.add(filter);
return this;
}
public void doFilter() {
for (Filter filter : mFilter) {
filter.doFilter();
}
}
}
Filter 接口及其子类
Filter 及子类是具体的过滤规则,在doFilter()里面进行具体过滤。
public interface Filter {
void doFilter();
}
客户端代码
public class Text {
public static void main(String[] args) {
String msg = "你好,范德萨skf.,.wfw.,思达高科*~~*";
MessageProcessor processor = new MessageProcessor();
FilterChain filterChain = new FilterChain();
processor.setMsg(msg);
processor.setmFilterChain(filterChain);
filterChain.addFilter(new HTMLFilter()).addFilter(new TEXTFilter());
processor.processor();
}
}
扩展
执行某个过滤规则后,在加入另外的过滤规则链
结构图
让FilterChain实现Filter即可。
客户端代码
只需要在客户端加入另外一个FilterChain即可
public class Text {
public static void main(String[] args) {
String msg = "你好,范德萨skf.,.wfw.,思达高科*~~*";
MessageProcessor processor = new MessageProcessor();
// 第一个过滤链
FilterChain filterChain = new FilterChain();
processor.setMsg(msg);
processor.setmFilterChain(filterChain);
FilterChain filterChain1 = new FilterChain();
filterChain.addFilter(new HTMLFilter()).addFilter(new TEXTFilter());
filterChain1.addFilter(new HTMLFilter()).addFilter(new TEXTFilter());
// 在当前过滤链加入另外的过滤链
filterChain.addFilter(filterChain1);
processor.processor();
}
}