什么是链?前后相连,一个连接下一个,其中包括多个节点,其实责任链模式也类似,他是多个对象之间相互关联,下一个对象的操作由上一个对象关联下来,上一个对象有个方法用于指向其他对象。职责链之间的前后关系是可以改变的,主要看上一节点主要指向哪个节点。
android中事件分发就是责任链模式的具体表现:
View的ontouchEvent返回值设置,如果为true,交个自己的消费事件的方法去处理,如果为false,则继续向下一个进行传递。
如何实现责任链模式:
比如责任链上有,A,B,C三个对象,如果A有权限则自己处理,否则传递下去给B,B如果没有权限处理,则传递下去,C如果有权限处理,则处理,否则不处理。
A中有判断的逻辑,一个是符合条件的,自己去处理,一个是不符合自身条件的,交给链条中的下一个对象去处理,B,C一次类推都是同样的道理。
花鼓传花比赛,失败表演节目的例子来讲讲:
首先创建责任链传递的抽象类:比如下面这个类:
基类,封装处理handler()和指向下一个节点setNextHandler()的方法:
public abstract class Handler { protected Handler handler; public Handler setNextHandler(Handler carHandler) { //根据参数指向下一个handler对象 this.handler = carHandler; return this.handler; } //当前对象的实际操作 public abstract void handler(); }
传花同学A:
public class AHandler extends Handler { @Override public void handler() { System.out.println("A表演节目"); if(this.handler != null){ this.handler.handler(); } } }
传花同学B:
public class BHandler extends Handler { @Override public void handler() { System.out.println("B表演节目"); if(this.handler != null){ this.handler.handler(); } } }
传花同学C:
public class CHandler extends Handler { @Override public void handler() { System.out.println("C表演节目"); if(this.handler != null){ this.handler.handler(); } } }
测试类:
public class Test { public static void main(String[] args) { Handler aHandler = new AHandler(); Handler bHandler = new BHandler(); Handler cHandler = new CHandler(); System.out.println("-------a==>b==>c--------"); aHandler.setNextHandler(bHandler); bHandler.setNextHandler(cHandler); aHandler.handler(); System.out.println("1-------b==>a==>c--------"); bHandler.setNextHandler(aHandler); aHandler.setNextHandler(cHandler); bHandler.handler(); System.out.println("2-------b==>a==>c--------"); bHandler.setNextHandler(aHandler).setNextHandler(cHandler); bHandler.handler(); } }
测试结果:
-------a==>b==>c-------- A表演节目 B表演节目 C表演节目 1-------b==>a==>c-------- B表演节目 A表演节目 C表演节目 2-------b==>a==>c-------- B表演节目 A表演节目 C表演节目