设计模式之【职责链模式】

金三银四,表妹拿到大厂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
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值