模版模式、策略模式、职责链模式。这三种模式都具有相同的作用:复用和扩展,在实际的项目开发中比较常用,特别是框架开发。我们可以利用他们来提供框架的扩展点,能够让框架的使用者在不修改框架源码的情况下,基于扩展点定制化框架的功能。
职责链模式的原理和实现
职责链模式,将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,知道链上的某个接收对象能够处理它为止。
职责链模式,有两种实现方式,一种是使用链表,一种是数组。如果职责链上的某个处理器能够处理这个请求,那就不会继续往下传递请求。实际上,职责链模式还有一种变体,那就是请求会被所有的处理器都处理一遍,不存在中途终止的情况。
下面用数组的方式实现职责链模式
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中即可,其他的代码不需要修改。