背景
最近在做需求,写一个方法,先在前面做验证,if不满足A条件则return,if不满足B条件则return...一共写了5个验证,等验证通过以后才执行下面的逻辑,这个也没问题。过了一阵产品提了需求,跟这个方法类似,我又把这个方法copy了一份,只不过验证条件稍微有点不一样,要变成6个验证了。
这时候我就发现有三个问题,第一重复代码,相同的A条件B条件C条件写了两份,没有复用。第二,“头重脚轻”,比如100行的方法,前面60行都是验证,后面40行才是真正有用的业务代码,你看一个方法功能的时候前面验证肯定是不关心的,只看后面40行到底在干什么逻辑,所以要缩短验证代码的行数。第三,先后顺序,一个方法A是在B之前验证的,另一个方法A是在B之后验证的,调整起来很不方便。
这时候我就想到了用责任链模式来进行优化解决。
定义
责任链模式(Chain of Responsibility Pattern)是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。属于行为型模式。
生活中的应用场景就是审批流。责任链模式主要是解耦了请求与处理,客户只需将请求发送到链上即可,无需关心请求的具体内容和处理细节,请求会自动进行传递直至有节点对象进行处理。
通用UML类图
例子
下面写一个登录验证判断的例子,一般责任链模式会搭配着建造者模式一起用,即链式编程,因为这样链条看起来更加清晰明了,而传统的写法很抽象,很难看出谁谁谁在谁的前面,谁谁谁在谁的后面,如下所示:
AAAHandler.setNextHandler(deptManagerLeaveHandler);
directLeaderLeaveHandler.setNextHandler(deptManagerLeaveHandler);
BBBHandler.setNextHandler(AAAHandler);
deptManagerLeaveHandler.setNextHandler(gManagerLeaveHandler);
下面先创建一个Handler的抽象类,这个类里面有一个下一个Handler处理器next,还有一个Builder,这个就是用来构建链的,也是方便我们的链式编程。
public abstract class Handler<T> {
protected Handler next;
private void next(Handler next) {
this.next