一, 什么是回调函数(callback)

假如类A有1个方法a(), 但是它不知道什么时候调用这个方法a().

而类B告诉类A, 我知道什么时候调用.    那么类A就把自己交给类B(作为类B的一个成员),   当时机适合时, 类B会调用类A的a()方法.

那么a() 就叫回调(callback)方法.

可能我上面的解释不够好,

记住关键两点就得了:

1. 类A 要成为类B的一个成员,    java中是通过接口(interface)来实现的.

2. a()的执行由类B决定, 但是执行的是类A的方法a()

二, 什么要使用回调方法.

是啊, 为什么不直接使用类A来调用a()呢?

实际上这个也涉及层次的问题.

实际上, 类B可以调用类A的方法a(),   但是有时也可以调用其他比如类c的方法c(), 只要类c实现了接口, 替换成类B的成员.

也就是说, 客户端只需要跟类B打交道, 无需知道实际执行的哪个类的哪个方法.

比如一个间公司有1个快递部门(类B), 所有员工都可以找这个快递部门寄快递,   但是实际上这个部门是用顺丰(类A)来快递的.

但是当顺丰快递有问题时,  类B也可以找另一间快递公司,比如EMS(类C)来实现.

那么公司员工就不必与真正的快递公司打交道, 只需把物件交给类B去处理就ok了. 也就是这个过程是动态的. 甚至也可以找另一件公司来实现(类D), 只需要类D实现快递接口.

三, 基于上面快递的一个具体例子

现在我们就基于上面的例子写一段代码.

3.1 UML图

可以见上面有5中角色

分别是:

员工:  Employee

快递部门: ExDepartment

回调(快递)接口: Callbackable

具体快递公司: SFExpress & EMS

下面是具体代码:

3.2 Callbackable

这个接口只需要定义1个回调方法method()

public interface Callbackable {public void method();
}

3.3 ExDepartment

同样地, 快递部门类必须预留1个接口成员.

它可以选择1个实现了Callbackable接口的对象作为自己的成员,

public class ExDepartment {private Callbackable exCompany;public void setExCompany(Callbackable exCompany) {this.exCompany = exCompany;}public ExDepartment(Callbackable exCompany){this.setExCompany(exCompany);}public void sendGoods(){exCompany.method();}
}

这个部门有1个快递方法sendGoods(), 但是实际上是调用这个快递公司成员的回调方法.method();

3.4 SFExpress

具体的快递公司类顺丰, 必须实现Callbackable接口,

并重写里面回调方法.

public class SFExpress implements Callbackable{public void SFSendGoods(){System.out.println("Sent goods by SF!");}@Overridepublic void method() {// TODO Auto-generated method stubthis.SFSendGoods();}}

3.5 EMS

同上

public class EMS implements Callbackable {public void EMSSendGoods(){System.out.println("Sent GOods by EMS");}@Overridepublic void method() {// TODO Auto-generated method stubthis.EMSSendGoods();}}

3.6 Employee

员工类, 无需知道具体快递公司的存在, 只需要跟快递部门打交道就ok了

public class Employee {public void sendGoods(ExDepartment exd){exd.sendGoods();}
}

3.7 客户端代码和输出:

     ExDepartment exd = new ExDepartment(new SFExpress());Employee jack = new Employee();jack.sendGoods(exd);exd.setExCompany(new EMS());jack.sendGoods(exd);exd.setExCompany(new Callbackable() {@Overridepublic void method(){System.out.println("Sent goods by Jimmy!");}});jack.sendGoods(exd);

输出:

Sent goods by SF!
Sent GOods by EMS
Sent goods by Jimmy!

可以见到, 员工寄了3次快递, 第一次是顺丰, 第一次是EMS, 但是第三次是某个人(可能两个快递公司都放假, 随便找个人来送)

这个模型的好处时,

无论有什么具体快递类的修改, 只需要修改快递类本身.

而增加快递公司类, 只需让那个类实现回调接口, 而员工类和快递部门类都无需修改的.

四, java的控件事件方法也是用回调来实现的.

上面的代码有这么一段:

exd.setExCompany(new Callbackable() {@Overridepublic void method(){System.out.println("Sent goods by Jimmy!");}});

上面用到了内部类的方法.

是不是觉得有d面善.

这种写法跟java的button事件定义优点类似.

下面是新建1个button的例子:

JButton btnNewButton = new JButton("New button");btnNewButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {}});

其中btnNewButton就相当于上面例子的快递部门ExDepartment

而ActionListener实际上就是1个回调接口. (在这里也叫监听器)

而actionPerFormed就是1个回调方法.

没错, java界面(awt/swt)的控件事件就是通过回调来实现的.

你们想想, 一个button,  按下去做什么不是固定的.

有的button触发 行为a(), 有些触发行为b()

所以, 我们让行为b()写成回调方法, 也就是所让它所需的类实现 回调接口ActionListener().

这样, 就可以很灵活地为每1个button定义不同的触发行为了!

java 回调(callback)函数简介.相关推荐

  1. Java 回调 (Callback) 接口学习使用

    文章目录 Java 回调 (Callback) 接口学习使用 1.什么是回调(Callback)? 2.Java代码示例 2.直接调用 3.接口调用 4.Lambda表达式 推荐看我的InfoQ地址, ...

  2. Java回调(callback)机制

    一.简述 从软件模块之间的调用方式看,分为三类:同步调用.异步调用和回调. 1️⃣同步调用 同步调用是最基本并且最简单的一种调用方式,类 A 的 a() 调用类 B 的 b(),一直等待 b() 执行 ...

  3. Java 回调函数的理解

    以下是我对java回调函数的理解,希望对各位有帮助. 简而言之,假设有两个类A与B,还有一个回调接口C(有一个c方法).其中A类持有一个B类对象作为属性和拥有一个a方法,并实现了接口C,所以A类中就有 ...

  4. java addcallback函数_java中怎么使用callback函数?

    UYOU 在很多场景,作为开发都会想到,在执行完毕一个任务的时候,能执行一个callback函数是多么好的事情.现在模拟一下这个情景:定义三个类.分别是主函数类.callback函数的接口类.业务处理 ...

  5. [实战]java回调函数

    下面使用java回调函数来实现一个测试函数运行时间的工具类: 如果我们要测试一个类的方法的执行时间,通常我们会这样做: java 代码 public   class  TestObject { /** ...

  6. java反射回调函数_用J2V8注册Java回调函数

    J2V8是一套针对谷歌的V8 JavaScript引擎的Java绑定.J2V8的开发为Android平台带来了高效的Javascript的执行环境,taris.js 就是基于J2V8开发的.J2V8同 ...

  7. Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通 ...

  8. Java 回调函数作用和使用场景

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

  9. Java中callback作为函数参数传递

    反射方法类Method 需要callback函数为变量时,java通常用反射(java.lang.reflect)的相关方法. import java.lang.reflect.Method; 利用M ...

最新文章

  1. 我在实际工作中用的最多的 git 命令,全在这里了,使用简单!
  2. select html value属性,HtmlSelect.DataValueField 属性 (System.Web.UI.HtmlControls) | Microsoft Docs...
  3. java三点确定圆弧_圆弧方向判断方法和三点确定一个圆的计算方法
  4. tb计算机存储单位_如何节省数TB的云存储
  5. adb for linux的工具包,adb工具包下载_adb工具包官方下载「最新版」-太平洋下载中心...
  6. 【mxGraph】源码学习:(6)mxGraphModel
  7. 别再让「聪明」害了00后!
  8. Microsoft PPT文本框里首行缩进单位只能默认为厘米而不能设置为“字符”等其他单位?
  9. DAY 10 | 自学前端第十天
  10. Java学习笔记类对象多态继承(下)
  11. Windows Server - AD域 副域控
  12. matlab针对电阻和电源电动势为r1,第三章 电力电子与MATLAB应用技术
  13. 城市级智能网联示范区情况全扫描(2021版)
  14. 美团java后台面经
  15. ACCESS备件管理数据库分类出入库改进
  16. 使用pymysql将excel表格的数据导入mysql数据库(CRUD)(附代码)
  17. PIM协议(PIM-DM、PIM-SM)
  18. 信息课为什么不叫计算机课,信息技术课
  19. RTT之定时与中断理解
  20. excel单元格内容拆分

热门文章

  1. union一个有趣的应用
  2. buu [GKCTF2020]汉字的秘密
  3. Android locksettings/gatekeeper代码导读
  4. 面向对象封装继承多态五大基本原则魔法方法反射
  5. etcd 多台服务器集群
  6. 后台服务显示右下角弹窗 -- system权限创建用户权限进程
  7. 手机 滑动_真的滑动屏,华为手机柔性屏新的专利布局
  8. 题目2:隐式图的搜索问题(A*算法解决八数码)
  9. Python操作Json、Csv、Excel文件
  10. Spring boot的配置类