design principle:java 回调与委派/委托机制

系统 2038 0

design principle:java 回调与委派/委托机制

原文地址: http://blog.csdn.net/AndroidBluetooth/article/details/6937468

博客  design principle:模拟 android Button 控件点击事件    主要说了一下模拟 android 的 Listener 模式,其实这就是一种委派与回调机制的体现。

委派,也可以叫做委托,从字面上来理解的话,应该是委托其他类做事情而自己不做或者只做一部分工作;而回调,就是调用自己的方法。

在 java 中,这两种机制很类似,你姑且可以认为它们就是一码事。

推荐一篇博文给大家:  Java中委托事件模型  

java 中,实现委派和回调都是通过接口来实现的。下面举个小例子吧!

该例子是这样的(只是一个例子):

ProfessionalWorker 、SparetimeWorker 负责发射 Rocket,Rocket 类通过接口 IRocketDelegate 委派(或者说是回调) ProfessionalWorker 、SparetimeWorker自己发射。

总之,Rocket不做具体的事情。看实例代码:

IRocketDelegate.java源码 

      
         1
      
      
        package
      
       mark.zhang;
      
2
3 public interface IRocketDelegate {
4
5 public abstract long startAtTime();
6
7 public abstract long endAtTime();
8
9 public abstract void sendDidFail();
10 }

共有三个方法,分别是用于计算 Rocket 发射时间、计算 Rocket 发射完毕的时间以及发送是否失败的。

Rocket.java源码

 

      
         1
      
      
        package
      
       mark.zhang;
      
2
3 public class Rocket {
4
5 IRocketDelegate delegate = null ;
6
7 public Rocket(IRocketDelegate delegate) {
8 this .delegate = delegate;
9 }
10
11 private long getRocketStartTime() {
12 long startTime = delegate.startAtTime();
13 return startTime;
14 }
15
16 private long getRocketEndTime() {
17 long endTime = delegate.endAtTime();
18 return endTime;
19 }
20
21 public boolean isOk() {
22 // 超时0.1秒为失败
23 if (getRocketEndTime() - getRocketStartTime() >= 100) {
24 delegate.sendDidFail();
25 return false ;
26 }
27 return true ;
28 }
29
30 }

在这个类中,声明一个 IRocketDelegate 接口对象,使用该对象调用接口的方法。我们知道,接口不可以直接实例化,换句话说,实例化接口必须实现接口的所有方法。

那么,我们就把这些实现工作交给具体的发射者来完成。实现回调。

ProfessionalWorker.java源码

      
         1
      
      
        package
      
       mark.zhang;
      
2
3 public class ProfessionalWorker implements IRocketDelegate {
4
5 @Override
6 public long startAtTime() {
7 System.out.println("startAtTime is call-back inProfessionalWorker!");
8 return System.currentTimeMillis();
9 }
10
11 @Override
12 public long endAtTime() {
13 System.out.println("endAtTime is call-back in ProfessionalWorker!");
14 return System.currentTimeMillis();
15 }
16
17 @Override
18 public void sendDidFail() {
19 System.out.println("ProfessionalWorker send Rocket fail !");
20 }
21
22 public void send() {
23 if ( new Rocket( this ).isOk()) {
24 System.out.println("ProfessionalWorker send Rocket ok !");
25 }
26 }
27 }

SparetimeWorker.java源码

            
               1
            
            
              package
            
             mark.zhang;
            
2
3 public class SparetimeWorker {
4 public void send() {
5 boolean isOk = new Rocket( new IRocketDelegate() {
6
7 @Override
8 public long startAtTime() {
9 System.out.println("startAtTime is call-back in SparetimeWorker !");
10 return System.currentTimeMillis();
11 }
12
13 @Override
14 public long endAtTime() {
15 System.out.println("endAtTime is call-back in SparetimeWorker!");
16 return System.currentTimeMillis() + 100L;
17 }
18
19 @Override
20 public void sendDidFail() {
21 System.out.println("SparetimeWorker send Rocket fail !");
22 }
23 }).isOk();
24
25 if (isOk) {
26 System.out.println("SparetimeWorker send Rocket ok !");
27 }
28 }
29 }

这个类采用内部类的方式完成。

Test.java

      
         1
      
      
        package
      
       mark.zhang;
      
2
3 public class Test {
4
5 public static void main(String[] args) {
6 new ProfessionalWorker().send();
7
8 System.out.println("*********************************************");
9
10 new SparetimeWorker().send();
11 }
12 }

显示结果

      
        1
      
       endAtTime is call-back in ProfessionalWorker!
      
2 startAtTime is call-back inProfessionalWorker!
3 ProfessionalWorker send Rocket ok !
4 *********************************************
5 endAtTime is call-back in SparetimeWorker!
6 startAtTime is call-back in SparetimeWorker !
7 SparetimeWorker send Rocket fail !

这就体现 Java 中的一句话 Don't call me,I'll call you. 其含义就是回调(或者委派/委托)。

android 中很多这样的用法,关于接口的好处还有很多,后续慢慢研究,记住一句话:面向对象面向接口编程。

design principle:java 回调与委派/委托机制


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论