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

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

  • 相关阅读:
    sublime-生成html1.0
    sublime代码片段
    单色半透明-兼容IE7
    IE
    身心被掏空
    屏幕适配的方法
    宫格布局实例(注意jquery的版本号要统一)
    宫格布局实例(注意jquery的版本号要统一)2
    有 n个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数。
    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
  • 原文地址:https://www.cnblogs.com/fiteg/p/2332760.html
Copyright © 2011-2022 走看看