`
庄周小孟
  • 浏览: 25970 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
社区版块
存档分类
最新评论

java回调机制的简易实现办法

阅读更多

java回调机制的简易实现办法

【转载,出自百度文库

贡献时间:2012-01-29


贡献者: sjailjq 崭露头角 三级

 

1.  什么是回调函数
    所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及Java 的RMI都用到回调机制,可以访问远程服务器程序。回调函数包含下面几个特性:
    1、属于工作流的一个部分;
    2、必须按照工作流指定的调用约定来申明(定义);
    3、他的调用时机由工作流决定,回调函数的实现者不能直接调用回调函数来实现工作流的功能;   

2. 回调机制
    回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。

java回调机制:
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。

同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;
回    调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。

回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

实例:

1、 回调类接口

/**
 * 回调类接口
 *
 */
public interface CallBack {

    public String findCallBack();
   
}

2、调用者

/**
 * 调用者
 *
 */
public class AnotherFunction {
    CallBack findCallBack;

    // 调用实现类方法
    public String doCallback() {
        return findCallBack.findCallBack();
    }

    /* 业务需要的时候,通过委派,来调用实现类的具体方法 */
    public void setCallback(CallBack findCallBack) {
        this.findCallBack = findCallBack;
    }
}


3、测试回调函数

/**
 * new CallBack给调用者anotherFunction对象传递了一个实现CallBack接口的匿名类,
 * 这样AnotherFunction类的对象就取得了一个实现接口的类, 可以在任何时候调用接口中的方法
 */
public class CallMainTest {
    public static void main(String[] args) {
        // 创建调用者实现类
        AnotherFunction anotherFunction = new AnotherFunction();
        // 将回调类接口注册进实现类中
        anotherFunction.setCallback(new CallBack() {

            @Override
            public String findCallBack() {
                return "在CallMainTest类中实现但不能被CallMainTest的对象引用,而由AnotherFunction对象调用";
            }

        });
        //接收回调函数返回的信息
        String info = anotherFunction.doCallback();
        //打印输出
        System.out.println(info);
    }
}




上述的代码:

  1.两个类:匿名类和AnotherFunction

  2.匿名类实现接口CallBack(在CallMainTest测试的main方法中用匿名类的形式实现)

  3.AnotherFunction拥有一个参数为CallBack接口类型的函数setCallback(CallBack findCallBack)

  4.匿名类运行时调用AnotherFunction 中setCallBack函数,以自身传入参数 

  5.AnotherFunction 已取得匿名类,就可以随时回调匿名类中所实现的CallBack接口中的方法
   
  回调方法的使用通常发生在“java接口”和“抽象类”的使用过程中。模板方法设计模式就使用方法回调的机制,该模式首先定义特定的步骤的算法骨架,而将一些步骤延迟到子类中去实现的设计模式。模板方法设计模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
  模板方法设计模式适用性:
1、 一次性实现一个算法的不变部分,并将可变的算法留给子类来实现。
2、 各子类中公共的行为应该被提取出来并集中一个公共父类中以避免代码重复。
3、 可以控制子类扩展。
设计实例:
1. AbstractClass
   定义抽象的原语操作,具体的子类将重定义它们以实现一个算法的各步骤。
   实现一个模板方法,定义一个算法骨架。
   该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。
/**
 * 抽象模板方法类
 *
 */
public abstract class CallBackAbstract {

    //需要到子类中实现的方法
    public abstract void print();
    //模板方法
    public void update() {
        System.out.println("模板中的方法");
        for (int i = 0; i < 3; i++) {
            print();
        }
    }
}


2. ConcreteClass
   实现原语操作以完成算法中与特定子类相关的步骤。


/**
 * 具体子类实现继承模板方法类
 *
 */
public class CallBackConcrete extends CallBackAbstract {

    @Override
    public void print() {
        System.out.println("子类中具体实现的方法被调用");

    }

}
3. 测试类
public class CallTemplateMainTest {

    public static void main(String[] args) {
        CallBackConcrete cbc=new CallBackConcrete();
        //调用子类中实现的具体方法
        cbc.print();
        //调用模板方法中的实现方法
        cbc.update();
    }
}
4. 输出结果:
  子类中具体实现的方法被调用
  模板中的方法
  子类中具体实现的方法被调用
  子类中具体实现的方法被调用
  子类中具体实现的方法被调用

分享到:
评论

相关推荐

    接口回调实现简易购物车功能

    在这个例子中,`ShoppingCart`类并不直接与界面交互,而是通过回调机制将添加商品的结果传递给`UIUpdater`,保持了良好的模块化和解耦。这种方式使得购物车功能可以更灵活地与其他系统集成,比如库存管理系统或支付...

    接口回调实现简易购物城功能

    接下来,让我们探讨一下如何实现这个接口回调机制: 1. **定义接口**:首先创建`OnCartItemUpdated`接口,它包含一个`onItemUpdated`方法,接收商品ID和新的商品信息作为参数。 ```java public interface ...

    通过简易例子讲解Java回调机制

    Java回调机制是一种设计模式,它允许一个对象在完成特定任务时通知另一个对象。这种机制使得代码更加灵活,因为被调用者可以在适当的时候主动调用调用者的某个方法,而不仅仅是被动地接收返回值。回调在多线程、事件...

    android接口回调详解、简单例子+复杂例子

    在Android开发中,接口回调是一种常见的通信机制,用于在组件之间传递信息,特别是在异步操作中,如网络请求、文件读写等。接口回调能够帮助我们处理这些操作的结果,使得程序更加灵活和响应式。本篇文章将深入讲解...

    Java rpc框架简易版,类似dubbo分布式实现 (纯socket实现).zip

    异步模型下,客户端发送请求后立即返回,然后通过回调或轮询等方式获取结果。 10. **心跳检测**:保持客户端和服务端的连接状态,防止连接因网络问题而断开,心跳检测是必要的。简易版可能会有一个定时任务来检查...

    android回调demo

    在Android开发中,回调机制是一种常见的编程模式,用于处理异步操作或事件响应。这个“android回调demo”是为了帮助开发者直观地理解回调是如何工作的。在这个简单的示例中,我们将探讨回调的基本概念、如何在...

    用Java写的简易聊天室

    【Java简易聊天室】是一个基于Java编程语言实现的桌面应用程序,它允许用户通过网络进行基本的文字交流。这个项目主要展示了网络编程和多线程技术在实际应用中的运用,是学习和理解这些概念的一个良好实践。 1. **...

    java做的聊天小程序

    为了实现实时性,可能需要使用异步编程模型,如Java的CompletableFuture或者回调机制。这样,当消息到达时,程序可以立即更新界面,而不是等待当前任务完成。另外,WebSocket协议也是实时通信的一个选择,它可以建立...

    java版本简易微信支付Demo,附带前后台代码,附带详细注释

    Java后台需要监听这个回调接口,接收到通知后进行验证,确认支付成功后更新订单状态。 5. **支付结果查询接口**: 为了确保支付结果的准确性,除了等待微信的异步通知,还可以主动调用支付结果查询接口,获取订单...

    java局域网聊天室

    开发者会为这些事件设置监听器,当事件发生时执行相应的回调方法。 通过这个项目,初学者不仅可以学习到Java编程的基础,还可以了解到网络编程、多线程以及用户界面设计等多个重要概念。实际操作过程中,还需要考虑...

    java多线程聊天程序GUI界面socket实现.rar

    Java多线程聊天程序是基于GUI(图形用户界面)和Socket通信实现的,它允许多个用户通过网络进行实时交流。这个程序的核心在于如何利用Java的并发特性创建多线程环境,以及如何通过Socket来实现客户端与服务器之间的...

    MyNotifier一个简易的消息分发订阅机制工具

    5. **事件回调**:订阅者可以定义事件处理回调函数,当事件触发时,回调函数会被执行。 **使用场景** 1. **用户行为通知**:例如,在电商系统中,用户下单后,可以发布订单创建事件,订阅者(如邮件服务)可以接收...

    android简易天气预报源码

    4. **异步请求**:OkHttp支持异步请求,可以使用回调或协程处理网络请求的结果,避免阻塞UI线程。 在项目中,你可能使用OkHttp发送GET请求到天气API,获取特定城市的天气数据。例如,你可以创建一个`OkHttpClient`...

    山寨java版qq

    7. **事件驱动编程**:Java的事件模型(Event Model)用于处理用户的交互事件,如点击按钮、输入文字等,这通常与监听器(Listener)和回调函数(Callback)相关联。 8. **错误处理与异常处理**:为了保证程序的...

    android studio实现简易秒表

    为每个按钮设置一个`OnClickListener`,并在监听器的回调方法中编写相应功能的代码。例如,开始按钮的点击事件启动计时器,暂停按钮暂停计时,重置按钮则清零计时。 3. **计时器的使用**:在Android中,可以使用`...

    http简易工具类

    6. 异步请求:如果功能更完善,`WebUtils`可能还支持异步发送请求,使用回调或基于Future的机制处理结果。 7. 配置选项:例如超时设置、连接池管理等,以适应不同的网络环境和性能需求。 通过学习`WebUtils.java`...

    Android开发的简易计算器

    事件监听和回调机制也是Android开发中的关键部分。在这个计算器项目中,每个按钮的点击事件都会触发一个回调方法,该方法会根据被点击的按钮更新UI或执行相应的计算。这需要理解OnClickListener接口及其用法。 此外...

    JAVA语言异步非阻塞设计模式.docx

    等到结果准备好时,系统通过回调或事件通知机制执行后续处理,从而避免了不必要的等待,提升了整体效率。 **线程模型的对比** 同步阻塞模型中,线程在等待响应时会被挂起,无法执行其他任务,这导致CPU资源浪费。...

    简易计算器

    计算逻辑通常在`OnClickListener`的回调方法`onClick(View v)`内实现。这里,你需要维护两个变量来存储用户的输入(一个代表当前操作数,另一个代表之前的操作数),并使用条件判断来处理不同运算符的优先级。例如...

Global site tag (gtag.js) - Google Analytics