java回调机制实现
Java的接口支持提供了一种获得回调的等价功能的机制。其技巧是:定义一个简单的接口,并在该接口中声明我们要调用的方法。其特点是:一个实例持有一个接口的引用
例如,假设我们希望在某个时间发生时得到通知。我们可以定义一个接口:
Java代码
package com.wxy.callback;
public inte易做图ce InterestingEvent {
/**
*这是一个常规方法,如果需要,可以有返回值,也可以接受参数
*/
public void interestingEvent();
}
这使得我们可以控制实现该接口的类得任何对象。因此,我们不必关心任何外部类型信息。发出事件信号的类必须等待实现了InterestingEvent接口的对象,并在适当时候调用interestingEvent()方法。
Java代码
package com.wxy.callback;
public class EventNotifier {
/**事件对象*/
private InterestingEvent ie;
/**事件发生状态*/
private boolean somethingHappend;
/**
* 构造函数,传入事件对象以备后用
* @param event 事件对象
*/
public EventNotifier(InterestingEvent event) {
this.ie = event;
//事件未发生状态
somethingHappend = false;
}
/**
* 事件发生,调用InterestingEvent事件发生对象的方法发出事件信号
*/
public void doWork() {
//检查在别处设置的谓词
if (somethingHappend) {
//通过调用接口的这个方法发出事件信号
ie.interestingEvent();
}
}
}
在EventNotifier中,使用somethingHappend谓词来跟踪是否哦应触发事件。在许多情况下,调用此方法足以保证向interesthingEvent()发出信号。
希望接受事件通知的代码必须实现Interestingevent接口,并将自身引用传递给事件通知程序。
Java代码
public class CallMe implements InterestingEvent {
private EventNotifier en;
/**
* 创建事件通知程序,并将自身引用传递给它
*/
public CallMe() {
this.en = new EventNotifier(this);
}
/**
* 为事件定义实际的处理程序
*/
@Override
public void interestingEvent() {
System.out.println("oh,something interesting has happended!");
System.out.println("do some action!");
}
public EventNotifier getEn() {
return en;
}
public void setEn(EventNotifier en) {
this.en = en;
}
}
下面是一个典型的回调案例:公司员工工作,工作完成后主管要求员工汇报工作完成情况。
事件接口:
Java代码
package com.wxy.callback;
public inte易做图ce Event {
/**
* 返回发生事件信息
* @return 事件信息
*/
public String happendEvent();
}
事件具体实现类:
Java代码
package com.wxy.callback;
public class EventA implements Event {
@Override
public String happendEvent() {
return "job has been finished!";
}
}
Java代码
package com.wxy.callback;
public class EventB implements Event {
@Override
public String happendEvent() {
return "job has been finished!";
}
}
主管类:
Java代码
package com.wxy.callback;
public class Boss {
private String name;
public Boss(String name) {
this.name = name;
}
public void getStaffEvent(Staff staff, Event event) {
System.out.println("the msg what the boss received is--" + staff.getName() + ":"
+ event.happendEvent());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
员工类:
Java代码
package com.wxy.callback;
public class Staff {
private Event event; //事件
private String name; //员工姓名
private Boss boss; //员工所属主管
/**
* 员工构造器
&
补充:软件开发 , Java ,