Java回调函数的理解

来源:互联网 发布:单片机plc哪个好学 编辑:程序博客网 时间:2024/04/30 11:17

 所谓回调,就是客户程序Client调用服务程序Server中的某个函数funA(),然后Server又在某个时候反过来调用Client中的某个函数funB(),对于Client来说这个funB()就叫做回调函数,一般情况下,Client不会自己调用funB(),Client提供funB()的目的就是为了让Server来调用它,而且Client不得不提供这样一个函数。但是,由于Server并不知道Client所提供的funB()的具体情况,所以Server会约定funB()的接口规范(函数原型),然后由Client提前通过Server的一个函数register()来通知Server自己将要使用funB()函数,这个过程称为回调函数的注册,register()称为注册函数。


下面讲一个通俗的例子:
某天,我打电话向你请教一个问题,你一时想不出解决方案,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后在打电话通知我,这样,我就先挂了电话办其他事情去了。过了10分钟,我的手机响了,你电话告诉我问题的解决方案!

总结:这个案例中,你打电话告诉我解决方案就是一个"回调"的过程;我的手机号码必须在以前告诉你,这就是注册回调函数;我的手机号码必须有效并且能够接听到你的呼叫,这就叫回调函数必须符合接口规范。


实例:小明写了一段程序A,其中预留了回调函数接口,并封装好了该程序。小华写了一段程序B,小华想让程序A来调用自己程序B中的一个方法,于是,他通过程序A中的接口回调自己程序B中的方法。在c/c++中,要用回调函数,被调用的函数需要告诉调用者自己的指针地址,但在java中没有指针,怎么办呢?我们可以通过接口(Interface)来实现定义回调函数。


小明写的程序A:

public class CallAproTest {private ICallBack mcall;/*通过构造函数来设置接口的引用*/public CallAproTest(ICallBack mcall) {this.mcall = mcall;}/*在这个方法中调用回调方法*/public void call(){this.mcall.test();}}
定义一个接口,以便小华根据接口编写程序实现:

/** * 回调接口 * */public interface ICallBack {public void test();}

小华只要实现这个接口就能达到回调的目的了:

/** * 通过实现接口来达到实现回调的目的 */public class CallProTest2 implements ICallBack {/*实现接口中的额方法*/public void test() {System.out.println("回调!");}public static void main(String[] args) {/*创建小明程序的一个对象*/CallAproTest callAproTest = new CallAproTest(new CallProTest2());/*调用CallAproTest中的方法*/callAproTest.call();}}



0 0
原创粉丝点击