Callback的定义

一般在程序中执行回调函数是,是知道回调函数是预留给系统调用的,而且知道该函数的调用时机。

比如说android应用定义一个button对象,并给按钮添加一个监听事件,"onClick"方法就是常用的回调函数,用户触发该事件,android系统会自动调用该函数。

目前最常见的说明就是:

1.class   A,class   B   
  2.class   A实现接口callback
  3.class   B拥有一个参数为callback接口类型的函数
  4.class   A运行时调用class   B中的函数,以自身传入参数   
  5.class   B已取得A,就可以随时回调A所实现的callback接口中的方法

写了个例子,BadBoy,这类坏孩子喜欢打人,有个方法叫hit,hit只能对实现了Hitable的对象执行。这时候,BadBoy已经做完了自己的事,也就是已经打完人了,然后挨打的人肯定知道是谁打了自己,至于挨打的人是什么反应,BadBoy是无法控制的。挨打的人有可能哭有可能跑有可能报警。

BadBoy:

  1. class BadBoy {
  2. String name;
  3. public BadBoy(String name) {
  4. this.setName(name);
  5. }
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. //打人
  13. public void hit(Hitable hitable) {
  14. System.out.println("----------------BEGIN----------------");
  15. System.out.println("badboy " + this.getName() + "打了"
  16. + hitable.getName() + "一拳");
  17. hitable.beHit(this);
  18. System.out.println("-----------------END----------------");
  19. }
  20. }

挨打的人的接口,他们有一个共同的方法,就是beHit(BadBoy boy),既然挨打了,肯定知道是谁打的自己,所以打人者BadBoy被作为参数传进来。

  1. interface Hitable {
  2. public void beHit(BadBoy boy);
  3. public String getName();
  4. public void setName(String name);
  5. }

Child:这个类实现了Hitable,小孩挨打了,反应是哭。。

  1. class Child implements Hitable {
  2. String name;
  3. public Child(String name) {
  4. this.setName(name);
  5. }
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. @Override
  13. public void beHit(BadBoy boy) {
  14. System.out.println("child " + this.getName() + "被" + boy.getName()
  15. + "打哭了");
  16. }
  17. }

BigMan也实现了Hitable接口,这类人比较猛,挨打后的反应,是把打人者杀了。。

  1. class BigMan implements Hitable {
  2. String name;
  3. public BigMan(String name) {
  4. this.setName(name);
  5. }
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. @Override
  13. public void beHit(BadBoy boy) {
  14. System.out.println("bigman " + this.getName() + "把" + boy.getName()
  15. + "杀死了");
  16. }
  17. }

test类:

  1. public class CallBackTest {
  2. public static void main(String[] args) {
  3. BadBoy badboy = new BadBoy("Tom");
  4. Hitable child = new Child("Cat");
  5. Hitable bigman = new BigMan("Boris");
  6. badboy.hit(child);
  7. badboy.hit(bigman);
  8. }
  9. }

执行结果:

  1. ----------------BEGIN----------------
  2. badboy Tom打了Cat一拳
  3. child Cat被Tom打哭了
  4. -----------------END----------------
  5. ----------------BEGIN----------------
  6. badboy Tom打了Boris一拳
  7. bigman Boris把Tom杀死了
  8. -----------------END----------------

这个例子可以看出,坏孩子在打了挨打者以后,把自己作为参数给了挨打者,等于是告诉挨打者,“我打了你,你爱怎么着怎么着吧”,接下来挨打者调用方法beHit,不同类型的挨打者会对坏孩子做出不同的反应。 
这个例子类似一个通知,在做取值传值的时候会很有用。

例子2:

根据上边例子再联想一个例子,A取数据要给B,A是一个不断在polling数据的对象,B是一个接口,A取到数据后调用B接口的b方法,并且把自己的引用传给B,告诉B,我已经取到了你要的数据,你自己来拿吧,到这里,A已经完成了任务。B的实现类会根据自己的不同实现,在从A取来数据后进行处理,可能是排序,可能是输出到文件,也可能是打印。

例子2,证明了callback的另一个说法的概念:if you call me,I will call you back。

深入理解java回调机制的更多相关文章

  1. 转:一个经典例子让你彻彻底底理解java回调机制

    一个经典例子让你彻彻底底理解java回调机制 转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273 ...

  2. 一个经典例子让你彻彻底底理解java回调机制

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 所谓回调: ...

  3. 回调--一个经典例子让你彻彻底底理解java回调机制

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢 以前不理解什么叫回调 ...

  4. 理解java回调机制

    摘自:ImportNew 以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类 ...

  5. 一个例子教你理解java回调机制

    网上很多例子都写的很难理解,笔者刚开始都已经弄晕菜了. 这个例子,应该是再简单,再简洁不过的了,例子目的是测试某个方法的执行时间.这里就写三个java类,一个接口,一个实现,还有一个用于测试时间的类. ...

  6. Java回调机制总结

    调用和回调机制 在一个应用系统中, 无论使用何种语言开发, 必然存在模块之间的调用, 调用的方式分为几种: 1.同步调用 同步调用是最基本并且最简单的一种调用方式, 类A的方法a()调用类B的方法b( ...

  7. java回调机制及其实现(转)

    1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...

  8. java回调机制(写的很好)

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273) 以前不理解什么叫回调,天天听人家说加一个回调方法啥的 ...

  9. 从零开始理解JAVA事件处理机制(2)

    第一节中的示例过于简单<从零开始理解JAVA事件处理机制(1)>,简单到让大家觉得这样的代码简直毫无用处.但是没办法,我们要继续写这毫无用处的代码,然后引出下一阶段真正有益的代码. 一:事 ...

随机推荐

  1. 关于socket通讯,如何才能高效?

    关于socket通讯,如何才能高效? 网络通讯,一个不朽的话题,今天和一个做游戏的朋友(以前的同事聊天),他向我诉说了他的痛苦 他之前是做客户端的,无奈人力资源紧张,也开始搞服务器,他说自己的服务器总 ...

  2. QuickSwitchSVNClient,快速完成SVN Switch的工具

    [开源]QuickSwitchSVNClient,快速完成SVN Switch的工具 在实际的开发中,我们一般使用SVN工具进行源代码的管理.在实际的产品开发中,根据项目的一些定制要求,往往需要对某一 ...

  3. rabbitmq在mac上安装

    1.安装brew 打开http://bash.sh  执行 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/ ...

  4. vim 多行同时输入,且输入数值递增

    很有用的命令. 很给力的说. http://vim.wikia.com/wiki/Making_a_list_of_numbers 我在 html中需要增加新的标签的时候,就有用到过. 原来的html ...

  5. [置顶] Objective-C编程之道iOS设计模式单例解析(2)

    上一篇文章,提到了单例子类化的问题.正好最近,我在Stack Overflow看见一位国外高人,也谈及了单例子类化的一些内容.思考之后,总结了一些内容.其大意是利用NSDirectory存储不同子类的 ...

  6. 重复弹Toast的解决方案

    虽然网上有很多了,还是记录一下吧, 解决思路:不用计算Toast的时间之类的,就是定义一个全局的成员变量Toast, 这个Toast不为null的时候才去make,否则直接setText.为了按返回键 ...

  7. 子PID namespace中获取父namespace中pid的方法

    在那篇< 使用独立PID namespace防止误杀进程>中的最后,我碰到了一个难题,那就是父PID namespace中的进程无法使用进入子PID namespace中通过echo $$ ...

  8. JMX操作ActiveMQ(2)

    默认情况下,ActiveMQ使用useJmx后,jmx的url为 service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi 这时,jmx的MBean se ...

  9. .Net程序员学用Oracle系列(1):导航目录

    本人从事基于 Oracle 的 .Net 企业级开发近三年,在此之前学习和使用的都是 (MS)SQL Server.未曾系统的了解过 Oracle,所以长时间感到各种不习惯.不方便.怪异和不解,常会遇 ...

  10. redis 学习笔记——redis集群

    redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...