Java回调机制初探
2016-08-02 11:43
239 查看
一直以来,对于回调机制都颇多好奇,今天将所学的Java的回调机制做一个简单总结,温故而知新吧。
一般来说,参与回调过程的参与者有四种:调用者、执行者、回调函数、回调函数约束接口。
1)调用者:指发起调用的部分,比如一个APP调用百度地图的接口,一段代码调用一个Jar中提供的功能。
2)执行者:执行者也叫任务执行者,主要被调用者调用,完成具体的某项工作。
3)回调函数:特指调用者和执行者约定的代码部分,在执行者完成任务之后,调用该部分代码。例如Jquery和 Ajax组合使用的回调函数。
4)回调函数约束接口:主要是为了屏蔽多个调用者的差异性,在调用回调函数时,不必区分不同的调用者,只需要调用接口中已实现的方法即可。Java的动态类别识别机制会自动调用调用者的回调函数。
下图反应了四者之间的关系。
从图中可以看出,一般调用者和执行者约定一个模块(这个模块通常利用接口进行约束),在执行者成功完成 任务之后,执行该模块。
闲话不多说,程序猿还是要用代码来表达。
本例是这样一种逻辑:有两种调用者Caller1和Caller2,他们都存在一个计算两个数加和的需求,如果每个调用者都实现这一功能,会使得代码变得重复臃肿。于是,本着能甩锅就甩锅的原则,他们找到了一个人JobWorker,这个人刚好能做加法(支持double型加法)。原本Caller1和Caller2都需要各自完成的功能,现在可以都由JobWorker完成了。(JobWorker:宝宝心里苦,宝宝不说。。。)
Caller1内部实现
Caller2内部实现
可以看出,Caller1和Caller2在执行加和任务时,都是调用cllMethod方法,然后在其中调用JobWorker的doJob方法来具体完成任务。
现在来看JobWorker的实现。
如上图所示,JobWorker的工作比较简单,就是做加法。然后在得出结果之后,调用与调用者约定好的回调函数callBackSuccessMethod方法。
为了屏蔽不同的调用者的类型,这里在每一个调用者内部实现了新的类,由该类各自实现WorkerInterface中约定的回调方法。
WorkerInterface如下图。
Caller1实现接口的情况如下图。
Caller2实现接口情况。
这里两种调用者只是打印出了执行信息,更复杂的功能如网络网络通信功能、数据库访问等此处没有做演示。
接下来进行测试。
执行结果如下图。
总结:创建了两种调用者Caller1和Caller2,分别调用JobWorker的doJob方法完成具体的任务。同时Caller1和Caller2各自实现了WorkerInterface接口,通过接口屏蔽了两种不同的调用者类型。同时两者调用者还各自实现了自己回调方法。例子比较简单,但是差不多是这么个原理。后期还可以继续加入比较复杂的设计模式。
待完善和思考:如果被调用者JobWorker是单例模式,又该如何进行Synchronized控制?
一般来说,参与回调过程的参与者有四种:调用者、执行者、回调函数、回调函数约束接口。
1)调用者:指发起调用的部分,比如一个APP调用百度地图的接口,一段代码调用一个Jar中提供的功能。
2)执行者:执行者也叫任务执行者,主要被调用者调用,完成具体的某项工作。
3)回调函数:特指调用者和执行者约定的代码部分,在执行者完成任务之后,调用该部分代码。例如Jquery和 Ajax组合使用的回调函数。
4)回调函数约束接口:主要是为了屏蔽多个调用者的差异性,在调用回调函数时,不必区分不同的调用者,只需要调用接口中已实现的方法即可。Java的动态类别识别机制会自动调用调用者的回调函数。
下图反应了四者之间的关系。
从图中可以看出,一般调用者和执行者约定一个模块(这个模块通常利用接口进行约束),在执行者成功完成 任务之后,执行该模块。
闲话不多说,程序猿还是要用代码来表达。
本例是这样一种逻辑:有两种调用者Caller1和Caller2,他们都存在一个计算两个数加和的需求,如果每个调用者都实现这一功能,会使得代码变得重复臃肿。于是,本着能甩锅就甩锅的原则,他们找到了一个人JobWorker,这个人刚好能做加法(支持double型加法)。原本Caller1和Caller2都需要各自完成的功能,现在可以都由JobWorker完成了。(JobWorker:宝宝心里苦,宝宝不说。。。)
Caller1内部实现
Caller2内部实现
可以看出,Caller1和Caller2在执行加和任务时,都是调用cllMethod方法,然后在其中调用JobWorker的doJob方法来具体完成任务。
现在来看JobWorker的实现。
如上图所示,JobWorker的工作比较简单,就是做加法。然后在得出结果之后,调用与调用者约定好的回调函数callBackSuccessMethod方法。
为了屏蔽不同的调用者的类型,这里在每一个调用者内部实现了新的类,由该类各自实现WorkerInterface中约定的回调方法。
WorkerInterface如下图。
Caller1实现接口的情况如下图。
Caller2实现接口情况。
这里两种调用者只是打印出了执行信息,更复杂的功能如网络网络通信功能、数据库访问等此处没有做演示。
接下来进行测试。
执行结果如下图。
总结:创建了两种调用者Caller1和Caller2,分别调用JobWorker的doJob方法完成具体的任务。同时Caller1和Caller2各自实现了WorkerInterface接口,通过接口屏蔽了两种不同的调用者类型。同时两者调用者还各自实现了自己回调方法。例子比较简单,但是差不多是这么个原理。后期还可以继续加入比较复杂的设计模式。
待完善和思考:如果被调用者JobWorker是单例模式,又该如何进行Synchronized控制?
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序