zoukankan      html  css  js  c++  java
  • design principle:java 回调与委派/委托机制

    主要说了一下模拟 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 中很多这样的用法,关于接口的好处还有很多,后续慢慢研究,记住一句话:面向对象面向接口编程。

  • 相关阅读:
    使用dom4j来处理xml的一些常用方法
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318620.html
Copyright © 2011-2022 走看看