回调的意义在于,通过在其他对象中调用自身类中定义的函数,达到一定的目的(常见于事件注册,监听以及线程Runnable中的run)。
举例一:Parent类是接口,自带oncall函数(用于被其他任何人电话联系),父亲类Father实现Parent接口并重写oncall方法,Father类带有成员孩子类Children。Children类自带方法做作业doHomework(),做完作业后孩子应该及时电话通知老爸作业做完了!,因此doHomework中会调用Parent类的oncall方法告知父亲,作业已经完成。整个流程中oncall就是回调函数,是Father类定义的,被Children中调用并返回结果给Father类。
举例二(观察者模式):注册多个对某个事件监听的对象,这些对象由类CallListener实例化获取(该类实现一个事件发生的接口Event)。再定义类Notifier,其中维持一个监听对象的数组,用于一旦事件发生立即通知各个监听对象,具体处理问题逻辑全在监听类所定义的方法中,与Notifier无关,处理过程的方法是监听类中定义的,即Notifier回调CallListener中的方法,该方法就是叫做回调方法。
例二代码:
//接口,包含回调函数声明
public interface Event{
public void processEvent();
}
//实现接口的回调方法
public class CallListener implements Event{
private String name;
public CallListener(String name) {
// 新建一个事件通知者对象,并把自己传递给它
this.name= name;
}
// 实现事件发生时,实际处理事件的方法
@override
public void processEvent() {
// 监听到事件发生了,进行处理
}
}
//传入包含回调函数的对象
class Notifier{
private List callListenerList=new ArrayList();
public void regist(CallListener callListener){
callListenerList.add(callListener);\
}
public void doWork(){
for(CallListener callListener: callListenerList) {
//触发回调函数
callListener.processEvent("sample event");
}
}
}
测试代码:
public class Test {
public static void main(String[] args) {
Notifier notifier = new Notifier ();
CallListener a = new CallListener("Listener A");
CallListener b = new CallListener("Listener B");
// 给通知者注册监听者,并直接启动通知
notifier.regist(a);
notifier.regist(b);
// 此处回调监听Listener的processEvent处理事件
notifier.doWork();
}
}