Android 触摸事件 点击事件的分发机制 详解三---责任链模式

前面两节  我们讲述了 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里的过滤器 就是应用这个模式来完成的

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。