设计模式之责任链模式
顾名思义,这是一个链式传递,将责任一层一层传递,最终找到背锅的那位。
提取关键词: 链式传递,最终者。
那么必然前面一位要知道怎么把这个锅传给后面一位,要是都不知道后面一位是谁,怎么传递责任。
如同上图一样,假如一个系统出问题了,总监问主任,主任找部长,部长找组长,组长最终让程序员找原因,这样层层传递。
找到原因后也可以一层层将原因汇报上去。
假如部长有天挂了,主任一直不问世事,压根不知道组长是谁,那么他这个责任就传递不下去了。
还是以短信举例,在发短信前肯定有一大堆过滤器,黑名单校验的,内容校验的。
/**
* @author lw
* @date 2022/3/31 0031
* @description 号码过滤
*/
public class PhoneFilter implements CustomFilter {
private CustomFilter filter;
@Override
public void setNextFilter(CustomFilter filter) {
this.filter = filter;
}
@Override
public boolean filter(SmsInfo info) {
String blackPhone = "12306";//黑名单
if(blackPhone.equals(info.fromPhone)||blackPhone.equals(info.toPhone)){
System.out.println("PhoneFilter.filter");
return true;
}
if(this.filter!=null){
return this.filter.filter(info);
}
return false;
}
}
/**
* @author lw
* @date 2022/3/31 0031
* @description 内容过滤
*/
public class ContentFilter implements CustomFilter {
private CustomFilter filter;
@Override
public void setNextFilter(CustomFilter filter) {
this.filter = filter;
}
@Override
public boolean filter(SmsInfo info) {
if ("不法信息".equals(info.content)) {
System.out.println("ContentFilter.filter");
return true;
}
if (this.filter != null) {
return this.filter.filter(info);
}
return false;
}
}
调用者
ContentFilter contentFilter = new ContentFilter();
PhoneFilter phoneFilter = new PhoneFilter();
phoneFilter.setNextFilter(contentFilter);
//短信信息
SmsInfo info = new SmsInfo();
info.fromPhone = "1872671";
info.toPhone = "12306";
info.content = "hello world";
info.content = "不法信息";
boolean filter = phoneFilter.filter(info);
System.out.println(filter);
死循环
但是这里有一个注意点,曾经有这么一个人,写了如下的过滤,如下就形成了一个死循环。
ContentFilter contentFilter = new ContentFilter();
PhoneFilter phoneFilter = new PhoneFilter();
phoneFilter.setNextFilter(contentFilter);
contentFilter.setNextFilter(phoneFilter); //新增的代码
上述的链式调用就会变成如图的循环,如此就是永无止境。