我的项目中没有使用过回调机制,但是经常听人说要不要使用回调机制。 为了了解更多,我在网上阅读了一些博客文章; 我基本明白这是啥意思了。 有人说,这有点类似于策略模式。 我对这些设计模式了解不多,所以不做比较。 ,我只是单独对这个知识点做了一些记录,也对这两天的所见所闻做了一个小总结:
回调机制的本质是:A调用B中的方法b(); 在方法b中,调用A的方法a(); 而这个a就是回调方法:这里需要满足一些条件:
A 实现了一个接口,并且 a 方法由该接口定义。 A调用方法b时,必须传入自己的引用; 在方法b内部,方法a通过引用被调用。 这就是完整的回调机制。
这里我也用一个例子来进行说明:
例如:老板A想让秘书B订机票(方法b),他要忙着开会(A其他成员的方法),让她订好后告诉他航班的具体信息(方法一); 此时a方法就是一个回调函数。 具体代码如下:
public interface Callback { /** 获取航班信息 */ public void getFeedBack(); }
public class Manager implements Callback { private Worker worker; //获取B(秘书)的引用 public Manager(Worker worker) { this.worker = worker; worker.doWork("整理公司文件",this); //这是B的方法,传入了A(老板)的引用 } //回调方法 public void getFeedBack() { System.out.println("事情已完成"); } }
public class Worker { /** * 业务参数+接口引用 * @param str * @param callback */ public void doWork(String str , Callback callback){ if (str !=null){ callback.getFeedBack(); } } }
测试类:
public class CallbackTest { public static void main(String[] args) { Worker worker = new Worker(); Manager manager = new Manager(worker); manager.getFeedBack(); } }
这只是回调最基本的使用。 还可以看看异步回调,就是通过多线程来调用B的方法,这样A就可以继续做自己的其他事情,而不用等待B的方法完成。 可以看到如下代码:
/**
* 这是一个回调接口
* @author xiaanming
*
*/
public interface CallBack {
/**
* 这个是小李知道答案时要调用的函数告诉小王,也就是回调函数
* @param result 是答案
*/
public void solve(String result);
}
/**
* 这个是小王
* @author xiaanming
* 实现了一个回调接口CallBack,相当于----->背景一
*/
public class Wang implements CallBack {
/**
* 小李对象的引用
* 相当于----->背景二
*/
private Li li;
/**
* 小王的构造方法,持有小李的引用
* @param li
*/
public Wang(Li li){
this.li = li;
}
/**
* 小王通过这个方法去问小李的问题
* @param question 就是小王要问的问题,1 + 1 = ?
*/
public void askQuestion(final String question){
//这里用一个线程就是异步,
new Thread(new Runnable() {
@Override
public void run() {
/**
* 小王调用小李中的方法,在这里注册回调接口
* 这就相当于A类调用B的方法C
*/
li.executeMessage(Wang.this, question);
}
}).start();
//小网问完问题挂掉电话就去干其他的事情了,诳街去了
play();
}
public void play(){
System.out.println("我要逛街去了");
}
/**
* 小李知道答案后调用此方法告诉小王,就是所谓的小王的回调方法
*/
@Override
public void solve(String result) {
System.out.println("小李告诉小王的答案是--->" + result);
}
}
/**
* 这是一个回调接口
*@
*/
{
/**
* 这是小李知道答案时调用的告诉小王的函数,也就是回调函数。
* @param 就是答案
*/
无效解决();
/**
*这是小王
*@
* 实现了回调接口,相当于----->后台1
*/
王班{
/**
* 引用小丽对象
* 相当于----->背景2
*/
丽丽;
/**
* 小王的搭建方法有小李的参考
* @参数李
*/
王(丽丽){
这个.li = li;
/**
* 小王用这个方法向小李提问
* @param是小王想问的问题,1 + 1 = ?
*/
无效(最终){
//这里使用线程是异步的,
新(新(){
@
无效运行(){
/**
* 小王调用小李的方法,在这里注册回调接口
* 这相当于A类调用B的方法C
*/
li.(王.this,);
})。开始();
//小王问完问题后,就挂了电话,去做其他事情了,作弊。
玩();
无效播放(){
.out.("我要去购物");
/**
* 小李知道答案后,调用这个方法告诉小王,也就是所谓的小王的回调方法
*/
@
无效解决(){
.out.("小李告诉小王的答案是 --->" + );
/**
* 这是小李
*@
*/
李类{
/**
* 相当于B类中的f(),带参数---->背景3
* @参数
* @param 小王提出的问题
*/
空白 ( , ) {
.out.("小王提问--->" + );
//模拟小李自己的事情需要很长时间
for(int i=0;我
/**
* 小李做完自己的事情后,他认为答案是2
*/
= "答案是2";
/**
* 于是我给小王打电话,调用了小王的方法。
* 这相当于B类依次调用A的方法D
*/
。解决();
/**
* 测试类
*@
*/
类测试{
无效主([]参数){
/**
*新一点李
*/
li li = new Li();
/**
*新的小国王
*/
Wang wang = new Wang(li);
/**
* 小王问小李一个问题
*/
王.("1 + 1 = ?");
因此,基本用法先讲到这里,稍后会添加更深入的信息……