首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java回调机制兑现

2012-10-30 
java回调机制实现???? Java的接口支持提供了一种获得回调的等价功能的机制。其技巧是:定义一个简单的接口,

java回调机制实现

?

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

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

package com.wxy.callback;public interface InterestingEvent {    /**     *这是一个常规方法,如果需要,可以有返回值,也可以接受参数     */    public void interestingEvent();}

?

? 这使得我们可以控制实现该接口的类得任何对象。因此,我们不必关心任何外部类型信息。发出事件信号的类必须等待实现了InterestingEvent接口的对象,并在适当时候调用interestingEvent()方法。

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接口,并将自身引用传递给事件通知程序。

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;    }}

?

? 下面是一个典型的回调案例:公司员工工作,工作完成后主管要求员工汇报工作完成情况。

? 事件接口:

package com.wxy.callback;public interface Event {    /**     * 返回发生事件信息     * @return 事件信息     */    public String happendEvent();}

?? 事件具体实现类:

package com.wxy.callback;public class EventA implements Event {    @Override    public String happendEvent() {        return "job has been finished!";    }}

?

package com.wxy.callback;public class EventB implements Event {    @Override    public String happendEvent() {        return "job has been finished!";    }}

?主管类:

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;    }}

?员工类:

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 = boss;    }    public void doWork() {        System.out.println(name + " is doing working...");        //do somtething.....        for (int i = 0; i < 10; i++) {            System.out.println("sheep" + i);        }        System.out.println(name + " was finished work!");        //tell the boss what has happend,这里就是boss的回调方法        boss.getStaffEvent(this, event);    }    public Event getEvent() {        return event;    }    public void setEvent(Event event) {        this.event = event;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Boss getBoss() {        return boss;    }    public void setBoss(Boss boss) {        this.boss = boss;    }}

?测试类:

package com.wxy.callback;public class StaffBossTest {    public static void main(String args[]) {        //初始化员工和主管        Boss boss = new Boss("boss");        Staff staffA = new Staff("staffA", boss);        Staff staffB = new Staff("staffB", boss);        //主管发放了两个新任务        Event event1 = new EventA();        Event event2 = new EventB();        //员工接受任务开始干活        staffA.setEvent(event1);        staffB.setEvent(event2);        //员工干晚活,及时向主管反馈工作情况        staffA.doWork();        staffB.doWork();    }}

?测试结果:

staffA was finished work!the msg what the boss received is--staffA:job has been finished!staffB is doing working...sheep0sheep1sheep2sheep3sheep4sheep5sheep6sheep7sheep8sheep9staffB was finished work!the msg what the boss received is--staffB:job has been finished!

?可以看到,当员工完成工作时(即触发某事件时),staff对象调用boss对象的方法,实现回调功能。设计模式中,观察者模式也是一个典型的应用回调机制的例子。

?

?

?

   。。。。

热点排行