Java回调函数原理实例与代理模式的区别讲解

java 回调函数例子,及其原理,与代理模式的区别

回调函数

应用程序(application program)会时常通过API调用库里所预先备好的函数。但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务。这个被传入的、后又被调用的函数就称为回调函数(callback function)。

作用: 可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。

例子

一个计算函数运行时间的工具类,正常方法

/**
 * @Auther: cpb
 * @Date: 2019/1/17 16:32
 * @Description:
 */
public class RunningTime {
  /**
   * 一个用来被测试的方法,进行了一个比较耗时的循环
   */
  public  static  void testMethod(){
    for ( int i= 0 ; i< 100000000 ; i++){
    }
  }
  /**
   * 一个简单的测试方法执行时间的方法
   */
  public void testTime(){
    long begin = System.currentTimeMillis(); //测试起始时间
    testMethod(); //测试方法
    long end = System.currentTimeMillis(); //测试结束时间
    System.out.println("[use time]:" + (end - begin)); //打印使用时间
  }
  public static void main(String[] args) {
    RunningTime test=new RunningTime();
    test.testTime();
  }
}

创建回调函数接口

public interface CallBack {
  //执行回调操作的方法
  void execute();
}

回调函数

/**
 * @Auther: cpb
 * @Date: 2019/1/17 16:35
 * @Description:
 */
public class Tools {
  /**
   * 测试函数使用时间,通过定义CallBack接口的execute方法
   * @param callBack
   */
  public  void testTime(CallBack callBack) {
    long begin = System.currentTimeMillis(); //测试起始时间
    callBack.execute(); ///进行回调操作
    long end = System.currentTimeMillis(); //测试结束时间
    System.out.println("[use time]:" + (end - begin)); //打印使用时间
  }
  public  static  void main(String[] args) {
    Tools tool = new Tools();
    tool.testTime(new CallBack(){
      //定义execute方法
      public  void execute(){
        //这里可以加放一个或多个要测试运行时间的方法
        RunningTime.testMethod();
      }
    });
  }
}

为什么叫回调函数

我们观看一下程序运行的流程,tools->CallBacks->tools,顾为回调函数。

代理模式

//接口
public interface CallBack {
  //执行回调操作的方法
  void execute();
}
//实现类
public class MyCallBack implements CallBack{
  @Override
  public void execute() {
    MyCallBack.testMethod();
  }
  public  static  void testMethod(){
    for ( int i= 0 ; i< 100000000 ; i++){
    }
  }
}
//代理类
public class Proxy implements CallBack {
  private CallBack callBack;
  public Proxy(CallBack callBack){
    this.callBack = callBack;
  }
  @Override
  public void execute() {
    callBack.execute();
  }
}
//调用方法类
public class Tools {
  /**
   * 测试函数使用时间,通过定义CallBack接口的execute方法
   * @param callBack
   */
  public  void testTime(CallBack callBack) {
    long begin = System.currentTimeMillis(); //测试起始时间
    callBack.execute(); ///进行回调操作
    long end = System.currentTimeMillis(); //测试结束时间
    System.out.println("[use time]:" + (end - begin)); //打印使用时间
  }
  public  static  void main(String[] args) {
    Tools tool = new Tools();
    //让代理去实现方法去调用方法
    Proxy proxy = new Proxy(new MyCallBack());
    tool.testTime(proxy);
  }
}

代理模式和回调函数的区别

  1. 代理模式需要创建接口实现类,并放入代理类中,隔离性更好,扩展性好
  2. 回调函数不需要创建接口实现类,编写方便。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • 23种设计模式(7) java代理模式

    23种设计模式第七篇:java代理模式 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 角色: 1.抽象角色:声明真实对象和代理对象的共同接口. 2.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 3.真实角色:

  • Java设计模式之静态代理模式实例分析

    本文实例讲述了Java设计模式之静态代理模式.分享给大家供大家参考,具体如下: 代理模式,可以通过代理可以在原来的基础上附加一些其他的操作.静态代理模式相对比较简单无需再程序运行时动态的进行代理. 静态代理模式的角色: ① 抽象角色:真实对象和代理对象的共同接口.其中声明真实对象和代理对象需要做的事. ② 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用. ③ 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作. 下面提

  • Java设计模式之代理模式原理及实现代码分享

    简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术.生活中的方方面面都可以虚拟到代码中.代理模式所讲的就是现实生活中的这么一个概念:中介. 代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用. 代理模式包含如下角色: ISubject:抽象主题角色,是一个接口.该接口是对象和它的代理共用的接口. RealSubject:真实主题角色,是实现抽象主题接口的类. Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实

  • Java基于代理模式解决红酒经销问题详解

    本文实例讲述了Java基于代理模式解决红酒经销问题.分享给大家供大家参考,具体如下: 一. 模式定义 在代理模式中,有两个对象参与处理同一请求,接收的请求由代理对象委托给真实对象处理,代理对象控制请求的访问,它在客户端应用程序与真实对象之间起到了一个中介桥梁的作用.代理模式使用对象聚合代替继承,有效地降低了软件模块之间的耦合度. 二. 模式举例 1 模式分析 我们借用红酒经销来说明这一模式. 2 代理模式静态类图 3 代码示例 3.1 红酒工厂接口一IRedWine package com.de

  • 详解Java 中的三种代理模式

    代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法. 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理

  • Java设计模式之动态代理模式实例分析

    本文实例讲述了Java设计模式之动态代理模式.分享给大家供大家参考,具体如下: 前面介绍了静态代理模式,动态代理比静态代理模式更加强大.它能在程序运行时动态的生成代理对象.所谓动态代理类是在运行时生成的class,在生成它时,你必须提供一组interface给它,则动态代理类就宣称它实现了这些interface.当然,动态代理类就充当一个代理,你不要企图它会帮你干实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作. 动态代理的角色和静态代理的角色一样: ① 抽象角色:

  • 通过代码快速理解Java的三种代理模式

    代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需要修改,可以通过代理的方式来扩展该方法 UML图表示如下: 代理模式 静态代理 静态代理在使用时,需要定义接口或者父类.被代理对象与代理对象一起实现相同的接口或者是继承相同父类. 代码示例: interface Source{ vo

  • Java回调函数原理实例与代理模式的区别讲解

    java 回调函数例子,及其原理,与代理模式的区别 回调函数 应用程序(application program)会时常通过API调用库里所预先备好的函数.但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务.这个被传入的.后又被调用的函数就称为回调函数(callback function). 作用: 可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型.某些限制条件(如返回值为int)的被调

  • Java回调函数与观察者模式实例代码

    本文研究的主要是Java回调函数与观察者模式的实现,具体介绍和实现代码如下. 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 什么时候使用观察者模式: 当一个抽象模型有两个方面, 其中一个方面依

  • Java回调函数实例代码详解

    首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法.目的达到

  • java 回调机制的实例详解

    java 回调机制的实例详解 序言 最近接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法. 第1章. 故事的缘起 幼师在黑板上

  • Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行.这里,A称为"主叫函数"(Caller),B称为"被叫函数"(Callee). 间接调用:在函数A的函数体里并不出现函数B的函数名,而是使用指向函数B的函数指针p来使内存中属于函数B的代码片断得以执行--听

  • Java 回调函数深入理解

     Java 回调函数 概要: 所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供.由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数.Web Service以及Ja

  • JS回调函数原理与用法详解【附PHP回调函数】

    本文实例讲述了JS回调函数原理与用法.分享给大家供大家参考,具体如下: JS回调函数 何为回调函数,官方解释:当程序跑起来时,一般情况下,应用程序(application program)会时常通过API调用库里所预先备好的函数.但是有些库函数(library function)却要求应用先传给它一个函数,好在合适的时候调用,以完成目标任务.这个被传入的.后又被调用的函数就称为回调函数(callback function). 通常将一个函数B传入另一个函数A,并且在需要的时候再调用函数A. 说白

  • js回调函数原理与用法案例分析

    本文实例讲述了js回调函数原理与用法.分享给大家供大家参考,具体如下: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 函数指针是指向函数的指针变量. 因此"函数指针"本身首先应是指针变量,只不过该指针变量指向函数. 函数指针有两个用途:调用函数和做函数的参数. 作用:

  • 对Python3之进程池与回调函数的实例详解

    进程池 代码演示 方式一 from multiprocessing import Pool def deal_task(n): n -= 1 return n if __name__ == '__main__': n = 10 p = Pool(4) for i in range(4): res = p.apply(deal_task, args=(n,)) #调用apply是一个串行的效果,任务会被进程一个一个的处理,直接得到结果 #前提是执行的任务必须要有返回值 print(res) 方式二

  • CSS3结合jQuery实现动画效果及回调函数的实例

    写期末项目中,朋友提出的 idea ,当用户登录成功时欢迎用户的特效,即欢迎用户信息从底部上升到页面中,之后再退回底部. 他遇到的问题是:从底部能出来提示信息,但是出来之后就下不去了. 听过后,考虑之,想到用回调函数来解决这个Bug,然后模拟登录成功时进入主页(即刷新页面),弹出欢迎信息并消失,写了一个类似这样的动画效果.仅供参考: 效果图: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8

随机推荐