`
freewxy
  • 浏览: 336685 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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对象的方法,实现回调功能。设计模式中,观察者模式也是一个典型的应用回调机制的例子。

 

 

 

1
5
分享到:
评论
4 楼 kisssssss 2011-08-08  
   。。。。
3 楼 kisssssss 2011-08-08  
2 楼 kisssssss 2011-08-08  
1 楼 kisssssss 2011-08-08  
getStaffEvent(this, event);  
    }   

相关推荐

    深入浅出Java回调机制

    前几天看了一下Spring的部分源码,发现回调机制被大量使用,觉得有必要把Java回调机制的理解归纳总结一下,以方便在研究类似于Spring源码这样的代码时能更加得心应手。  注:本文不想扯很多拗口的话来充场面,我的...

    Java回调机制

     下面使用java回调函数来实现一个测试函数运行时间的工具类:如果我们要测试一个类的方法的执行时间,通常我们会这样做: public class TestObject {  /**  * 一个用来被测试的方法,进行了一个比较耗时的...

    Java利用接口实现回调

    在Java支持方法指针之前,Java接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。  熟悉MS-Windows和X Window System事件驱动编程模型的开发人员,习惯...

    Java按时间梯度实现异步回调接口的方法

    主要介绍了Java按时间梯度实现异步回调接口,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

    java 实现回调代码实例

    本文主要介绍Java的回调机制,并附实例代码以供大家参考学习,有需要的小伙伴可以看下

    Java中的接口回调

    接口回调是多态的另一种体现。...  现在有两个类,一个是A,一个是B,回调是A去调用B中的某个方法,然后B又回调A中的某个方法,这个方法是回调方法,回调的机制是与接口分不开的。  也是A类实现一个接口,并实

    设计模式Callback介绍与实例

    java回调机制: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。 &gt;同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用; &gt;回 调:一种...

    Java同步回调函数

    1.概述  软件模块之间总是存在着一定的接口,从...  回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知  所谓回调,是客户程序CLIENT调用服务程序SERVER中的某个函数

    java实现微信企业号和公众号服务端调用方法封装源码

    2.1 在回调模式下验证服务器接口地址 2.2 检验消息的真实性,并且获取解密后的明文. 2.3 将公众平台回复用户的消息加密打包. 2.4 获取AccessToken 2.5 获取网页授权access_token 2.6 获取临时素材文件(不包括视频)...

    EventBus最佳实践:Java手撕实现ESB底层事件委托处理机制的思路,配套演示代码

    但这种风格下又会导致上游组件并不能快速对下游组件的结果做出反馈,所以通常情况下可以采用AOP切面、函数式回调、委托对象、或者利用传址引用的特性来构建统一上下文的方式来解决。 所以EventBus的实现目标是: 1、...

    SpringBoot2.7集成flowable最新版,java工作流服务端实现,解耦设计

    3. 超级灵活的回调机制,不需要耦合任何业务逻辑就可以在任何项目中集成 ## 快速集成思路 flowable官方提供了rest-api包,本项目已经集成,可以直接由第三方调用。 我们为此开发一个轻量级的SDK,通过声明式快速...

    Java开发技术大全(500个源代码).

    impRecall.java 实现回调函数 inheritConstruct_1.java 构造器继承示例1 inheritConstruct_2.java 构造器继承示例2 inheritConstruct_3.java 构造器继承示例3 inheritConstruct_4.java 构造器继承示例4 ...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 继承、封装、多态的实现原理 容器 Java集合类总结 Java集合详解1:一文...

    Java工程师面试复习指南

    解读Java中的回调 反射 泛型 枚举类 Java注解和最佳实践 JavaIO流 多线程 深入理解内部类 javac和javap Java8新特性终极指南 序列化和反序列化 继承封装多态的实现原理 集合类 Java集合类总结 Java集合详解:一文读...

    JAVA 2平台安全技术-结构,API设计和实现

    本书明确而详尽地阐述了Java平台安全性,探究了Java安全结构的内幕。本书首先概述了计算机和网络安全概念并解释了Java安全模型,并...8.3.4 回调 147 8.3.5 访问控制 147 8.3.6 JAAS工具 149 8.4 小结 149 参考文献 151

    Java 2平台安全技术-结构,API设计和实现

    目目目录 前言 第1章 计算机与网络安全基础 1 ...1.2 危险和保护 2 1.3 外围防护 3 1.3.1 防火墙 4 1.3.2 仅仅使用外围防护的不足之处...8.3.4 回调 147 8.3.5 访问控制 147 8.3.6 JAAS工具 149 8.4 小结 149 参考文献 151

    Java调用机制步骤

    Java调用分为3种:同步调用,同步回调,异步回调  1.同步调用及平时常用的调用方式  2.回调在框架中使用较多,例如spring 的 AOP实现,servlet的拦截器实现  场景 老师布置完作业后提供一个回调方法,学生可以...

    疯狂JAVA讲义

    6.7.6 闭包(Closure)和回调 215 6.8 枚举类 217 6.8.1 手动实现枚举类 217 6.8.2 枚举类入门 219 6.8.3 枚举类的属性、方法和构造器 220 6.8.4 实现接口的枚举类 223 6.8.5 包含抽象方法的枚举类 224 6.9 ...

    Java2实用教程.rar

    4 13 3接口回调 4 13 4接口做参数 4 14内部类 4 15匿名类 4 15 1和类有关的匿名类 4 15 2和接口有关的匿名类 4 16异常类 4 16 1try catch语句 4 16 2自定义异常类 4 17Class类 4 17 1获取类的有关信息 4 17 2使用...

Global site tag (gtag.js) - Google Analytics