设计模式之美(13)-行为型-职责链模式

模版模式、策略模式、职责链模式。这三种模式都具有相同的作用:复用和扩展,在实际的项目开发中比较常用,特别是框架开发。我们可以利用他们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展点定制化框架的功能。

职责链模式的原理和实现

职责链模式,将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,知道链上的某个接收对象能够处理它为止。
职责链模式,有两种实现方式,一种是使用链表,一种是数组。如果职责链上的某个处理器能够处理这个请求,那就不会继续往下传递请求。实际上,职责链模式还有一种变体,那就是请求会被所有的处理器都处理一遍,不存在中途终止的情况。
下面用数组的方式实现职责链模式

public interface IHandler {
    boolean handler();
}
public class HandlerA implements IHandler {
    @Override
    public boolean handler() {
        boolean handler = false;
        //业务逻辑
        System.out.println("HandlerA  doHandld");
        return handler;
    }
}
public class HandlerB implements IHandler {
    @Override
    public boolean handler() {
        boolean handler = false;
        //业务逻辑
        System.out.println("HandlerB  doHandld");
        return handler;
    }
}
public class HandlerChain {
    private List<IHandler> handlerList = Lists.newArrayList();
    public void addHandler(IHandler iHandler){
        handlerList.add(iHandler);
    }
    public void doHandler(){
        for (IHandler iHandler : handlerList) {
            if (iHandler.handler()) {
                break;
            }
        }
    }

    public static void main(String[] args) {
        HandlerChain handlerChain = new HandlerChain();
        handlerChain.addHandler(new HandlerA());
        handlerChain.addHandler(new HandlerB());
        handlerChain.doHandler();
    }
}

上面代码是责任链模式的实现,响应中断,如果中间某个链返回true,那么后续链就会中断,另外一种是返回值设置为handler方法的void,让循环走完,不设置中断的情况。

职责链模式的应用场景举例

对于用户生成内容的应用来说,用户生成的内容,可能会包含一些敏感词。针对这个场景,我们可以利用职责链模式来过滤这些敏感词。

对于敏感词的内容,有两种处理方式,一种是直接禁止发布,另一种是给敏感词打马赛克(例如替换成***)之后再发布。第一种处理方式符合可以中断的职责链模式,第二种处理方式符合职责链模式的变体实现。

责任链模式如何应对代码的复杂性

将大块代码逻辑拆分成函数,将大类拆分成小类,是应对代码复杂性的常用方法。应用职责链模式,我们把各个敏感词过滤函数继续拆分出来,设计成独立的类,解决类中代码过多,过复杂的情况。

责任链模式如何让代码满足开闭原则,提高代码的扩展性

当我们要扩展新的过滤算法的时候,如果是非职责链模式的代码实现方式,我们需要修改非职责链类的代码,违反了开闭原则。不过这样的修改比较几种,也是可以接收的。而职责链模式的实现方式更加优雅,只需要新添加一个Filter类,并且通过addFilter函数将它添加到chain中即可,其他的代码不需要修改。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就是不掉头发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值