3、定义请求的具体实现
// 具体请求类01 class Request01 extends AbstractRequest { public Request01(String content) { super(content); } @Override public int getRequestLevel() { return Levels.LEVEL_01; } } // 具体请求类02 class Request02 extends AbstractRequest { public Request02(String content) { super(content); } @Override public int getRequestLevel() { return Levels.LEVEL_02; } } // 具体请求类03 class Request03 extends AbstractRequest { public Request03(String content) { super(content); } @Override public int getRequestLevel() { return Levels.LEVEL_03; } } 4、定义处理请求的抽象类 // 抽象处理者类, abstract class AbstractHandler { // 责任链的下一个节点,即处理者 private AbstractHandler nextHandler = null; // 捕获具体请求并进行处理,或是将请求传递到责任链的下一级别 public final void handleRequest(AbstractRequest request) { // 若该请求与当前处理者的级别层次相对应,则由自己进行处理 if (this.getHandlerLevel() == request.getRequestLevel()) { this.handle(request); } else { // 当前处理者不能胜任,则传递至职责链的下一节点 if (this.nextHandler != null) { System.out.println("当前 处理者-0" + this.getHandlerLevel() + " 不足以处理 请求-0" + request.getRequestLevel()); // 这里使用了递归调用 this.nextHandler.handleRequest(request); } else { System.out.println("职责链上的所有处理者都不能胜任该请求..."); } } } // 设置责任链中的下一个处理者 public void setNextHandler(AbstractHandler nextHandler) { this.nextHandler = nextHandler; } // 获取当前处理者的级别 protected abstract int getHandlerLevel(); // 定义链中每个处理者具体的处理方式 protected abstract void handle(AbstractRequest request); } 5、实现具体的请求处理类 // 具体处理者-01 class Handler01 extends AbstractHandler { @Override protected int getHandlerLevel() { return Levels.LEVEL_01; } @Override protected void handle(AbstractRequest request) { System.out.println("处理者-01 处理 " + request.getContent() + "\n"); } } // 具体处理者-02 class Handler02 extends AbstractHandler { @Override protected int getHandlerLevel() { return Levels.LEVEL_02; } @Override protected void handle(AbstractRequest request) { System.out.println("处理者-02 处理 " + request.getContent()+ "\n"); } } // 具体处理者-03 class Handler03 extends AbstractHandler { @Override protected int getHandlerLevel() { return Levels.LEVEL_03; } @Override protected void handle(AbstractRequest request) { System.out.println("处理者-03 处理 " + request.getContent()+ "\n"); } } 6、测试类 // 测试类 public class Client { public static void main(String[] args) { // 创建指责链的所有节点 AbstractHandler handler01 = new Handler01(); AbstractHandler handler02 = new Handler02(); AbstractHandler handler03 = new Handler03(); // 进行链的组装,即头尾相连,一层套一层 handler01.setNextHandler(handler02); handler02.setNextHandler(handler03); // 创建请求并提交到指责链中进行处理 AbstractRequest request01 = new Request01("请求-01"); AbstractRequest request02 = new Request02("请求-02"); AbstractRequest request03 = new Request03("请求-03"); // 每次提交都是从链头开始遍历 handler01.handleRequest(request01); handler01.handleRequest(request02); handler01.handleRequest(request03); } } 7、结果: 处理者-01 处理 请求-01 当前 处理者-01 不足以处理 请求-02 处理者-02 处理 请求-02 当前 处理者-01 不足以处理 请求-03 当前 处理者-02 不足以处理 请求-03 处理者-03 处理 请求-03 8、分析: 在上面抽象处理者 AbstractHandler 类的 handleRequest() 方法中,被 protected 修饰,并且该方法中调用了两个必须被子类覆盖实现的抽象方法,这里是使用了模板方法模式(Template Mehtod)。其实在这里,抽象父类的 handleRequest() 具备了请求传递的功能,即对某些请求不能处理时,马上提交到下一结点(处理者)中,而每个具体的处理者仅仅完成了具体的处理逻辑,其他的都不用理。 三、总结 1、处理者在运行时动态确定是我们在 Client 中组装的链所引起的,因为具体的职责逻辑就在链中一一对应起来; 2、因为不确定请求的具体处理者是谁,所以我们把所有可能的处理者组装成一条链,在遍历的过程中就相当于向每个处理者都提交了这个请求,等待其审查。并且在审查过程中,即使不是最终处理者,也可以进行一些请求的“包装”操作(这种功能类似于装饰者模式); 3、处理者集合的动态指定跟上面的第1、2点类似,即在 Client 类中创建了所有可能的处理者。 4、改变内部的传递规则 每个处理者都可以去动态地指定他的继任者。 5、可以从职责链任何一关开始。 6、用与不用的区别 不用职责链的结构,反映在代码上即使我们需要在一个类中去写上很多if….else语句。 如果用了职责链,相当于我们面对的是一个黑箱,我们只需要认识其中的一个处理者,然后让黑箱内部去负责传递就好了。