设计模式之责任链模式
顾名思义,这是一个链式传递,将责任一层一层传递,最终找到背锅的那位。
提取关键词: 链式传递,最终者。
那么必然前面一位要知道怎么把这个锅传给后面一位,要是都不知道后面一位是谁,怎么传递责任。
如同上图一样,假如一个系统出问题了,总监问主任,主任找部长,部长找组长,组长最终让程序员找原因,这样层层传递。
找到原因后也可以一层层将原因汇报上去。
假如部长有天挂了,主任一直不问世事,压根不知道组长是谁,那么他这个责任就传递不下去了。
还是以短信举例,在发短信前肯定有一大堆过滤器,黑名单校验的,内容校验的。
/**
* @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); //新增的代码
上述的链式调用就会变成如图的循环,如此就是永无止境。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?