一、回调函数

  在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。所谓回调函数是指:在程序中,A类和B类分别有两个函数M1、M2,其中A类首先调用了B类的M2函数,然后B类通过接口回调A类M1函数,我们就将M1称之为回调函数。

   1.1 示例故事背景

  有一天毛驴的苹果电脑坏了,就去京东上下单购买一台新的苹果电脑后去公园玩了。京东收到毛驴的订单后,通知仓储包装电脑。当包装完毕后仓储会将电脑交给物流来派送,最后由物流将电脑送到毛驴手上。流程图如下:

java回调函数 实现 java回调函数原理_回调函数


   1.2 代码示例

  在C/C++中,要用回调函数,被调用的函数需要用到调用者自己的指针地址,但在JAVA中没有指针,这么办?我们可以通过接口(interface)来实现回调函数。


[java]  
    
1. package com.lll.callback;  
2.   
3. /**
4.  * 此回调接口的作用是让底层类(京东商城)能够找到上层应用(毛驴)
5.  * @author liulongling
6.  *
7.  */  
8. public interface CallBack {  
9. void sendComputer(Computer computer);  
10. }


[java] 
1. package com.lll.callback;  
2.   
3. /**
4.  * 作为最上层应用,下层(京东商城)是不知道上层的实现。
5.  * 所以我们通过接口来实现回调函数
6.  * @author liulongling
7.  *
8.  */  
9. public class MaoLv implements CallBack{  
10.       
11. private JDShop shop;  
12.       
13. public MaoLv() {  
14. new JDShop();  
15. this);  
16.     }  
17.       
18. public void buyComputer(Computer computer)  
19.     {  
20. "毛驴:要购买一台"+computer.name+"电脑");  
21.         shop.buy(computer);  
22.     }  
23.       
24. @Override  
25. public void sendComputer(Computer computer) {  
26. "毛驴:收到电脑"+computer.name);  
27.     }  
28.       
29. }

 


[java] 
1. package com.lll.callback;  
2.   
3. /**
4.  * 京东商城 一个底层类
5.  * @author liulongling
6.  *
7.  */  
8. public class JDShop {  
9.       
10. private CallBack callBack;  
11.       
12. //注册一个接口直到要回调谁谁谁  
13. public void setCallBack(CallBack back)  
14.     {  
15. this.callBack = back;  
16.     }  
17. /**
18.      * 
19.      * @param back
20.      * @param computer
21.      */  
22. public void buy(Computer computer)  
23.     {  
24. "京东后台:收到毛驴的请求");   
25.            
26. //京东把消息告诉仓库  
27. "京东后台通知仓库:包装一台"+computer.name+"电脑发送给毛驴");   
28. //仓库开始包装商品  
29. "仓库开始包装"+computer.name+"电脑");   
30. //开始发货  
31. "仓库通知京东快递:将"+computer.name+"电脑送到毛驴手上");   
32.            
33.          callback(computer);  
34.     }  
35.       
36. public void callback(Computer computer)  
37.     {  
38.         callBack.sendComputer(computer);  
39.     }  
40. }


测试类


[java]  
    
1. package com.lll.callback;  
2.   
3. public class Test {  
4. public static void main(String[] args) {  
5. new MaoLv();  
6. new Computer("苹果"));  
7.     }  
8. }


   1.3 测试结果


控制台: +------------------------------------------------------------------+


毛驴:要购买一台苹果电脑

京东后台:收到毛驴的请求

京东后台通知仓库:包装一台苹果电脑发送给毛驴

仓库开始包装苹果电脑

仓库通知京东快递:将苹果电脑送到毛驴手上

毛驴:收到电脑苹果

+------------------------------------------------------------------+

  同步和异步的区别在同步用用会被阻塞,需要等到对方返回结果后才能去做别的事情。这里我就不举例说明了。