前面两节 我们讲述了 android 点击事件的分发流程。其实大家可以细细体会一下,这个分发的过程 始终是从顶层到下层。一层一层的按照顺序进行。
当然了,传到哪一层停止,我们可以通过重写某些方法来完成。
这个地方 android的开发人员很好的利用了 责任链模式来完成这边代码的编写。 下面我们就来讲一下 责任链模式到底是什么。以及如何运用。
大家知道 一个软件公司的基本架构就是 程序员----leader---project manager---boss 这种基础架构。
我们一般都会有teambuilding 对吧~~,比如说做完一个小项目 程序员小张 跟leader提议 我们building一次吧,申请经费若干元。
但是一般 leader只有权限批复 1000左右的经费,要是超过的话就要找manager去审批,当然manger也是有权限的,只能批复3000以下的
超过3000的 就只能找老板批准了。
这个就是典型的责任链模式。我们把这个生活中的场景 用代码来演示一遍 你们就知道责任链模式以后要怎么用了~~~~~
首先定义一个虚类,这个类就是我们的基础类。
1 package com.design.test; 2 3 public abstract class Handler { 4 5 private Handler successor = null; 6 7 public Handler getSuccessor() { 8 return successor; 9 } 10 11 public void setSuccessor(Handler successor) { 12 this.successor = successor; 13 } 14 15 public abstract void handlerRequest(String usr, int money); 16 17 }
然后定义一个leader。我们假设这个leader只有1000的批复权限。
1 package com.design.test; 2 3 public class Leader extends Handler { 4 5 @Override 6 public void handlerRequest(String usr, int money) { 7 if (money > 1000) { 8 System.out.println("leader 没有权限批准" + usr 9 + "申请的这次活动经费 因为超过了1000元 找pm申请去了"); 10 getSuccessor().handlerRequest(usr, money); 11 12 } else { 13 System.out.println("leader 批准了" + usr + "申请的这次活动经费 总共" + money 14 + "元"); 15 } 16 17 } 18 19 }
再定义一个manager 看看 ,假设他有3000的批复权限
1 package com.design.test; 2 3 public class Manager extends Handler { 4 5 @Override 6 public void handlerRequest(String usr, int money) { 7 // TODO Auto-generated method stub 8 if (money > 3000) { 9 System.out.println("Manager 没有权限批准" + usr 10 + "申请的这次活动经费 因为超过了3000元 找boss申请去了"); 11 getSuccessor().handlerRequest(usr, money); 12 } else { 13 System.out.println("Manager 批准了" + usr + "申请的这次活动经费,总共" + money 14 + "元"); 15 16 } 17 18 } 19 20 }
最后我们定义一个老板,既然是老板,权限当然是自己的,随便批复无上限 ,哈哈
1 package com.design.test; 2 3 public class Boss extends Handler { 4 5 @Override 6 public void handlerRequest(String usr, int money) { 7 // TODO Auto-generated method stub 8 9 System.out.println("Boss 批准了" + usr + "申请的这次活动经费 总共" + money + "元"); 10 11 } 12 13 }
然后我们来测试一下 这个责任链模式~~写个主类吧
package com.design.test; public class TestMain { public static void main(String[] args) { // TODO Auto-generated method stub Handler leader = new Leader(); Handler manager = new Manager(); Handler boss = new Boss(); leader.setSuccessor(manager); manager.setSuccessor(boss); leader.handlerRequest("张三", 800); System.out.println("----------------------"); leader.handlerRequest("张三", 1200); System.out.println("----------------------"); leader.handlerRequest("张三", 3200); } }
最后看下日志
leader 批准了张三申请的这次活动经费 总共800元
----------------------
leader 没有权限批准张三申请的这次活动经费 因为超过了1000元 找pm申请去了
Manager 批准了张三申请的这次活动经费,总共1200元
----------------------
leader 没有权限批准张三申请的这次活动经费 因为超过了1000元 找pm申请去了
Manager 没有权限批准张三申请的这次活动经费 因为超过了3000元 找boss申请去了
Boss 批准了张三申请的这次活动经费 总共3200元
到这边如果看懂代码就很好理解了。其实这个模式很多场景都在用。比如tomcat里的过滤器 就是应用这个模式来完成的