责任链模式在实际开发中属于比较常见的一种设计模式。假设我们要去某个公司面试,首先要到公司的前台打听,这时可能前台告诉你要去业务部门,这时你到了业务部门又被告知你应该去技术部门到了技术部门又被告知你应该去人事部门,因此最后我又不得不去人事部门。像这样,在我们找到合适的办事人之前,我们被不断地像皮球一样踢给一个有一个人,所以责任链模式也被叫做推卸责任模式。
在程序开发中,当外部请求需要某个类处理时,但是当前类无法处理该请求就需要推卸责任,把请求交给下一个类来处理,像这样我们把多个对象组成了一条责任链,然后按照它们在链上的顺序一个一个的找出到底该由谁来负责处理。下面我们来用代码来解释如何使用责任链模式。
首先定义一个抽象的处理器类Handler:
public abstract class Handler { private Handler next; public Handler setNext(Handler next) { this.next = next; return this.next; } protected abstract boolean resolve(); protected final void support(){ if(resolve()){ return; }else if(this.next!=null){ this.next.support(); }else{ System.out.println("谁也解决不了"); } } }
其中resolve方法需要子类去做具体的实现。
定义三个具体的处理类:
public class HandlerA extends Handler{ @Override protected boolean resolve() { System.out.println("我是HandlerA,我处理不了"); return false; } } public class HandlerB extends Handler{ @Override protected boolean resolve() { System.out.println("我是HandlerB,我处理不了"); return false; } } public class HandlerC extends Handler{ @Override protected boolean resolve() { System.out.println("我是HandlerC,我处理了"); return true; } }
最后创建责任链并调用:
public static void main(String[] args) { Handler hA = new HandlerA(); Handler hB = new HandlerB(); Handler hC = new HandlerC(); hA.setNext(hB); hB.setNext(hC); hA.support(); }
控制台输出:
我是HandlerA,我处理不了
我是HandlerB,我处理不了
我是HandlerC,我处理了
在责任链模式中的核心就是Handler对象角色,它需要知道下一个处理者是谁并返回该对象。在实际的开发中,责任链模式比我今天举得例子要复杂的多,例如tomcat的过滤器和mybatis中的plugin,这个两个的实现方式和我今天所讲的实现方式不尽相同,我会在我以后的文章中介绍。