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...
sheep0
sheep1
sheep2
sheep3
sheep4
sheep5
sheep6
sheep7
sheep8
sheep9
staffB was finished work!
the msg what the boss received is--staffB:job has been finished!

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值