refer:http://www.cnblogs.com/leon19870907/archive/2011/04/21/2024077.html
回调方法是把功能定义和功能实现分离的一种手段,是一种松耦合的设计思想。
Java中没有指针,不能传递方法的地址,一般采用接口回调实现:把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。
实现回调的原理简介如下:
首先创建一个回调对象,然后再创建一个控制器对象,将回调对象需要被调用的方法告诉控制器对象。控制器对象负责检查某个场景是否出现或某个条件是否满足。当此场景出现或此条件满足时,自动调用回调对象的方法。
可以举个现实生活中的例子:
一读者想借《软件技术学习与实践》这本书,但这本书已被其他读者借走了。于是,读者与图书馆管理员间发生了以下对话:
读者:“我把我的电话号码告诉你,等书一到就马上通知我。”
管理员:“好的。另一读者把书还回来后,马上给您打电话,书我先帮您留着。”
在上述这个场景中,读者就是“回调对象”,管理员就是“控制器对象”,读者的电话号码就是“回调对象的方法”。
回调方法的接口:
public interface ICallback
{
public void test();
}
回调方法的实现类(监听类):
public class CallbackImpl implements ICallback
{
@Override
public void test()
{
//do something...
System.out.println("excute test");
}
}
回调方法的调用类
public class Caller
{
private ICallback c;
public void setCallback(ICallback callback)
{
c = callback;
call();
}
public void call()
{
c.test();
}
}
这里的call()也可在业务类中用Caller的对象来调用。
业务处理类:
public class Main
{
public static void main(String[] args)
{
Caller caller = new Caller();
caller.setCallback(new CallbackImpl());
}
}
setCallback()方法回调了CallbackImpl中的test()方法。
也可不写实现类,而把方法的实现放在业务类中,用匿名类来实现相应的方法:
public class Main
{
public static void main(String[] args)
{
Caller caller = new Caller();
caller.setCallback(new ICallback()
{
@Override
public void test()
{
System.out.println("excute test");
}
});
}
}
熟悉Android中Button点击事件处理的同学应该都知道跟上面是一样的。
ICallBack------->OnClickListener接口
CallBackListener--------->实现OnClickListener接口的类
Caller-------->Button对象
Main-------->业务处理类(Activity)
相关Blog:
http://hi.baidu.com/%C9%B1%D6%ED%B5%B6%C6%B4%B5%B6/blog/item/aea1b34ffd7e64e5d72afc8f.html
http://blog.youkuaiyun.com/zuolongsnail/article/details/6598226