Java的回调机制

来源:互联网 发布:摄像头应用场景 知乎 编辑:程序博客网 时间:2024/06/05 15:31

本文要解决的问题:

简单分析一下Java 的回调机制。


一、回调函数

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

二、异步回调

   1.1 示例故事背景

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



   1.2 代码示例

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

package com.lll.callback;    /**  * 此回调接口的作用是让底层类(京东商城)能够找到上层应用(毛驴)  * @author liulongling  *  */  public interface CallBack {      void sendComputer(Computer computer);  }  

public class Computer {    public String name;   public Computer(String name){this.name = name;}}


package com.lll.callback;    /**  * 京东商城 一个底层类  * @author liulongling  *  */  public class JDShop {            private CallBack callBack;            //注册一个接口直到要回调谁谁谁      public void setCallBack(CallBack back)      {          this.callBack = back;      }      /**      *       * @param back      * @param computer      */      public void buy(Computer computer)      {           System.out.println("京东后台:收到毛驴的请求");                       //京东把消息告诉仓库           System.out.println("京东后台通知仓库:包装一台"+computer.name+"电脑发送给毛驴");            //仓库开始包装商品           System.out.println("仓库开始包装"+computer.name+"电脑");            //开始发货           System.out.println("仓库通知京东快递:将"+computer.name+"电脑送到毛驴手上");                       callback(computer);      }            public void callback(Computer computer)      {          callBack.sendComputer(computer);      }  } 

package com.lll.callback;    /**  * 作为最上层应用,下层(京东商城)是不知道上层的实现。  * 所以我们通过接口来实现回调函数  * @author liulongling  *  */  public class MaoLv implements CallBack{            private JDShop shop;            public MaoLv() {          shop = new JDShop();          shop.setCallBack(MaoLv.this);      }            public void buyComputer(Computer computer)      {          System.out.println("毛驴:要购买一台"+computer.name+"电脑");          shop.buy(computer);      }            @Override      public void sendComputer(Computer computer) {          System.out.println("毛驴:收到电脑"+computer.name);      }        }  
 view plain  

测试类

package com.lll.callback;    public class Test {      public static void main(String[] args) {          MaoLv lv = new MaoLv();          lv.buyComputer(new Computer("苹果"));      }  }  


   1.3 测试结果

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

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

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

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

仓库开始包装苹果电脑

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

毛驴:收到电脑苹果

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

 

三、同步回调

同步和异步的区别在同步用用会被阻塞,需要等到对方返回结果后才能去做别的事情。


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人流后带上环20天白带很黄怎么办 武警义务兵训练的时候没合格怎么办 小孩考试考的不好·家长怎么办 怀孕了不小心碰了屁股疼怎么办 新密职教中心开学军训有点慌怎么办 房产证是士兵证办的退伍后怎么办 士兵证办的银行卡退伍了怎么办 看左上牙后引发上颌窦炎怎么办 老板克扣进件加班工资应该怎么办 医生给婴儿按嘴巴碰到喉咙痛怎么办 事故逃逸人死对方要钱太多怎么办 毕业工作未满一年辞职档案怎么办 淘宝上买的东西客服不理怎么办 蚂蚁借呗还款后没显示还款怎么办 王者荣耀什么英雄都打的很烂怎么办 军校参加了政审体检误了怎么办 如果老板搬迁不给工人补偿怎么办 下面的毛很多又掉的厉害怎么办? 想去美国开饭店要怎么办签证 在沙漠中旅游如果车子坏了该怎么办 小磨床平面磨出来很粗怎么办 玩cs鼠标单点总是连点怎么办 论文出现计算上的错误该怎么办 不戴头盔违法扣分怎么办不了缴费 去法国会说英语不会说法语怎么办 企业有很多费用没有正式发票怎么办 我二张一万元的作废发票掉了怎么办 小规模上月开错税率的票怎么办 一般纳税人开票税率开错了怎么办 电信电子发票代表号码错了怎么办 发票备注栏项目名称写了两遍怎么办 苏州出入境手撕发票弄丢了怎么办 电脑下载过播放器还是不播放怎么办 局域网内的电脑无法互相访问怎么办 浏览器拖动滑动线页面会跳动怎么办 在暴风影音上视频播放不出来怎么办 格式工厂转换格式占内存太大怎么办 手机登陆不上路由器管理界面怎么办 新路由器设置密码后不能上网怎么办 更换网络后无线路由器不能用怎么办 手机登录不了路由器登录业面怎么办