金三银四,表妹拿到大厂offer了…
表妹:哥啊,经过过五关,斩六将,我终于拿到offer啦。
我:哇!恭喜恭喜呀!
表妹:真是太不容易了。
我:说说看,怎么不容易呀?
表妹:一二面都顺利通过了,HR面也很顺利,但是最后在谈薪环节,我这边提出更高的薪资,结果又安排多一轮总监面。
我:结果怎么样呢,通过了嘛?
表妹:还好通过啦。
你看,一轮面试,二轮面试,HR面试,后面又根据情况,加了一轮总监面。只有前面的面试通过了,才有机会进入到下一轮,这些面试串成一条链,不是很像我们设计模式中的职责链模式嘛?
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
我觉得这句话更好理解,“将链中的每一个节点看作是一个对象,每个节点处理的请求均不同,且每个节点内部自动维护了其后继节点对象,当一个请求在链路的头部出发时,会沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止。”—责任链模式原理和示例及其在Spring源码中的运用
我们知道,用户生成的内容可能包含一些敏感的词,比如涉黄、广告、或者是政治敏感词。现在有这么一个需求,就是审核用户生成的内容,如果含有这方面词汇的话,就不允许发布。
我们先来看一下第一种实现方式:
public class SensitiveWordFilter {
// 如果内容中不包含敏感信息的话,就返回true
public boolean filter(Content content) {
if (!filterSexyWord(content)) {
return false;
}
if (!filterAdsWord(content)) {
return false;
}
if (!filterPoliticalWord(word)) {
return false;
}
return true;
}
private boolean filterSexyWord(Content content) {
boolean legal = true;
// 判断是否含有黄色信息
return legal;
}
private boolean filterAdsWord(Content content) {
boolean legal = true;
// 判断是否含有广告
return legal;
}
private boolean filterPoliticalWord(Content content) {
boolean legal = true;
// 判断是否含有政治敏感信息
return legal;
}
}
这样写确实是能够实现需求,但是呢,很明显可以看到的是,有太多的if分支了,如果还要判断是否包含隐私信息,非法暴力信息等,那就会有更多的if分支。其次就是违背了开-闭原则,如果新增隐私信息过滤器,不但要在这个类里面新增一个filterPrivacyWord()方法,还要在filter()方法中增加一个if分支。
这时候,职责链模式就派上用场啦~
职责链模式
- Hanlder:抽象处理者角色,定义一个处理请求的接口,包含抽象处理方法和一个后继处理器。
- ConcreteHandler