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


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


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


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


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


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


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


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


IRocketDelegate.java源码

public interface IRocketDelegate {  public abstract long startAtTime();  public abstract long endAtTime();  public abstract void sendDidFail();
}  

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


Rocket.java源码

public class Rocket {  IRocketDelegate delegate = null;  public Rocket(IRocketDelegate delegate) {  this.delegate = delegate;  }  private long getRocketStartTime() {  long startTime = delegate.startAtTime();  return startTime;  }  private long getRocketEndTime() {  long endTime = delegate.endAtTime();  return endTime;  }  public boolean isOk() {  // 超时0.1秒为失败  if (getRocketEndTime() - getRocketStartTime() >= 100) {  delegate.sendDidFail();  return false;  }  return true;  }  }  

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


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


ProfessionalWorker.java源码

public class ProfessionalWorker implements IRocketDelegate {  @Override  public long startAtTime() {  System.out.println("startAtTime is call-back inProfessionalWorker!");  return System.currentTimeMillis();  }  @Override  public long endAtTime() {  System.out.println("endAtTime is call-back in ProfessionalWorker!");  return System.currentTimeMillis();  }  @Override  public void sendDidFail() {  System.out.println("ProfessionalWorker send Rocket fail !");  }  public void send() {  if (new Rocket(this).isOk()) {  System.out.println("ProfessionalWorker send Rocket ok !");  }  }
}  


SparetimeWorker.java源码

public class SparetimeWorker {  public void send() {  boolean isOk = new Rocket(new IRocketDelegate() {  @Override  public long startAtTime() {  System.out.println("startAtTime is call-back in SparetimeWorker !");  return System.currentTimeMillis();  }  @Override  public long endAtTime() {  System.out.println("endAtTime is call-back in SparetimeWorker!");  return System.currentTimeMillis() + 100L;  }  @Override  public void sendDidFail() {  System.out.println("SparetimeWorker send Rocket fail !");  }  }).isOk();  if(isOk) {  System.out.println("SparetimeWorker send Rocket ok !");  }  }
}  

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


Test.java

public class Test {  public static void main(String[] args) {  new ProfessionalWorker().send();  System.out.println("*********************************************");  new SparetimeWorker().send();  }
}  

显示结果

endAtTime is call-back in ProfessionalWorker!
startAtTime is call-back inProfessionalWorker!
ProfessionalWorker send Rocket ok !
*********************************************
endAtTime is call-back in SparetimeWorker!
startAtTime is call-back in SparetimeWorker !
SparetimeWorker send Rocket fail !  

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


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

design principle:java 回调与委派/委托机制相关推荐

  1. java 父委托机制优点_Java虚拟机父类委托机制设计的优点

    Java虚拟机父类委托机制设计的优点 昨天朋友的聊天中,讨论起了Java虚拟机的机制,父类委托机制,根加载器.扩展类加载器.应用类加载器.....说了很多,但是朋友(辉哥)的一句话,为什么这样设计呢? ...

  2. Java 类加载体系之 ClassLoader 双亲委托机制

    Java 类加载体系之 ClassLoader 双亲委托机制 java 是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件 ...

  3. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

  4. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  5. 关于Java类加载双亲委派机制的思考(附面试题)

    转载自 关于Java类加载双亲委派机制的思考(附面试题) 预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 &l ...

  6. 打破双亲委派机制有什么用_被打破的双亲委托机制

    在介绍ClassLoader之前,先提几个问题: 1.新建一个java工程,创建一个Long类,在里面写上如下代码 package java.lang;public class Long { publ ...

  7. Java的双亲委派机制

    Java的双亲委派机制是java中类加载过程采用的机制,所以首先要理解java的类加载过程. 类加载过程:程序经过javac.exe命令以后,会生成一个或多个class字节码文件,接着使用java.e ...

  8. 【04-JVM面试专题-什么是双亲委派机制(父类委托机制)?如何打破双亲委派机制?双亲委派机制的优缺点?什么是沙箱安全机制呢?】

    什么是双亲委派机制?如何打破双亲委派机制? JVM的双亲委派机制知道吗?怎么打破它呢?你看看自己掌握的怎么样呢? 什么是双亲委派机制?(父类委托机制) 检查某个类是否已经加载 自底向上,从Custom ...

  9. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

最新文章

  1. 聊聊 scala 的模式匹配
  2. [转]linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
  3. ES6新特性之map和reduce方法的使用
  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]47.什么是Fiat-Shamir变换?
  5. checkbox ajax 不选中的值,php – 无法通过ajax传递checkbox的值
  6. chrome谷歌浏览器安装教程 20200701
  7. 阿里五年晋升三次,选择真的大于努力?
  8. 汽车编程都是用matlab,MATLAB编程与汽车仿真应用
  9. layui,返回的数据不符合规范,正确的成功状态码 (code) 应为:0
  10. C语言实例第9期:提取字符串中全部数字
  11. java学习代码01 范围:基本测试、标识符、数据类型、运算符、控制语句
  12. 异数OS国产CPU平台移植项目需求分析
  13. 快速截图工具——百度输入法的扩展功能
  14. SMAA算法详解 - SMAASearchYUp(Down)
  15. python发行版是什么意思_致 Python 初学者
  16. Android中来电号码归属地的显示
  17. Linux权限维持—后门篇
  18. 【MD】高等数学常用符号
  19. Arduino IDE 控制 RX8025 的完美办法(有库链接)
  20. 抽丝剥茧:复盘美国中央情报局CIA的复杂网络武器杀伤链

热门文章

  1. DataGridView滚动慢的解决方法
  2. Linux 小知识翻译 - 「端口限制」
  3. WCF中使用HttpContext.Current的办法
  4. C# Regex(3)
  5. python中的赋值和深浅拷贝
  6. 09-JS中table模糊查询
  7. 关于VC中的stdafx.h
  8. 开发出高性能的网站系列文章
  9. oozie的作业调度
  10. Spring事务传播特性实例解析