java回调机制实现(一)

2014-11-24 01:45:34 · 作者: · 浏览: 3

Java的接口支持提供了一种获得回调的等价功能的机制。其技巧是:定义一个简单的接口,并在该接口中声明我们要调用的方法。其特点是:一个实例持有一个接口的引用

例如,假设我们希望在某个时间发生时得到通知。我们可以定义一个接口:

Java代码

package com.wxy.callback;

public interface 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 interface 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; //员工所属主管

/**

* 员工构造器

* @param name 员工姓名

* @param boss 传入Boss对象,便于回调反馈工作状况

*/

public Staff(String name, Boss boss) {

this.name = name;

this.boss =