1、 责任链模式为某个请求创建一个对象链,每个对象依次检查此请求,并对其进行处理,或者将它传给链中的下一个对象。
2、 应用场景:经常用于过滤器,拦截器,事件( 鼠标键盘事件,冒泡事件等 )等场景。Servlet 中的过滤器 Filter 就是典型的责任链模式
3、 优点
请求者和接收者解耦;
可以动态地增加或减少责任链上的对象,或者修改顺序。
缺点
调用者不知道请求可能被哪些责任链对象处理,不利于排错;
用户请求可能被责任链中途拦截,最终未必被真正执行,这点既是优点也是缺点,我们可以利用它做权限控制拦截器。
public class Info {
public void setStr(String str) {
this.str = str;
}
String str;
public Info(){
str = "this is some infomations. ad ad ad mingan mingan heike heike";
System.out.println(str);
}
public String getInfo(){
return str;
}
}
public abstract class InfoFilter {
protected InfoFilter successor;
public void setSuccessor(InfoFilter successor) {
this.successor = successor;
}
protected final void next(Info info){
if(this.successor != null){
this.successor.doInfoFilter(info);
}
}
public abstract void doInfoFilter(Info info);
}
public class AdInfoFilter extends InfoFilter {
@Override
public void doInfoFilter(Info info) {
String str = info.getInfo();
str = str.replaceAll("ad","**");
info.setStr(str);
System.out.println("已经过滤掉广告信息." + str);
next(info);
}
}
public class WordInfoFilter extends InfoFilter {
@Override
public void doInfoFilter(Info info) {
String str = info.getInfo();
str = str.replaceAll("mingan","%%");
info.setStr(str);
System.out.println("已经过滤掉敏感信息..." + str);
next(info);
}
}
public class HeikeInfoFilter extends InfoFilter {
@Override
public void doInfoFilter(Info info) {
String str = info.getInfo();
str = str.replaceAll("heike","##");
info.setStr(str);
System.out.println("已经过滤掉黑客信息." + str);
next(info);
}
}
public class RespChainTest {
public static void main(String[] args) {
InfoFilter adInfoFilter = new AdInfoFilter();
InfoFilter wordInfoFilter = new WordInfoFilter();
InfoFilter heikeInfoFilter = new HeikeInfoFilter();
adInfoFilter.setSuccessor(wordInfoFilter);
wordInfoFilter.setSuccessor(heikeInfoFilter);
Info info = new Info();
adInfoFilter.doInfoFilter(info);
}
}