`
ouqi
  • 浏览: 41865 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

浅谈回调

 
阅读更多

本文也是在查阅了各种资料下总结的,有什么问题还望各位大牛指正~
 一. 基本概念
  回调是一种双向调用的模式。被调用方在接口被调用时也会调用对方的接口。恩,具体来说,就是调用者A调用了被调用者B的方法,然后在B的这个方法体内又调用了A的方法。概念听起来很抽象。举个例子说明下,比如今天你去饭店吃饭,可是人满需要排队,于是你在饭店登记了一下(告诉他们你的手机号),告知他们如果有地方了就电话联系你。这是一个回调应用于异步的经典场景。你(调用者)在调用饭店(被调用者)的方法服务时,注册(登记)了自己的方法(电话通知你)。然后在饭店为你服务的过程中,又回调了你这个方法。
  这样做有什么好处呢?
  1. 异步:因为饭店现在满员,为你服务很慢,这个时候你就可以把等待的时间用来干别的事情(而不是空等待),等到饭店通知你了之后,再继续吃饭。
  2. 模板:可能不同的客户需要不同的通知方式(不仅限于电话通知),饭店可以忽略这些,使用同一种处理方式,一个个叫号,到了之后,就按照当初客户登记的方式去通知客户。但是客户登记的这个方式必须符合饭店统一的规范。
 

二. 具体实现以及应用场景
  1. C语言,主要是利用函数指针来进行的。举一个应用于模板的例子:

 

 
  

 max函数之所以能对一组任意类型的对象进行操作,关键在于传给max的是指向对象的指针所构成的数组,而不是对象本身所构成的数组,这样max不必关心对象到底是什么类型,只需转给比较函数cmp,然后根据比较结果做相应操作即可,cmp是调用者提供的回调函数,调用者当然知道对象是什么类型以及如何比较。
     回调的体现:调用者调用了max函数(被调用者),同时将比较规则的函数指针cmp_student传给了max函数。而max函数又调用了调用者提供cmp_student函数。这就体现了回调。
     2. java语言,主要是使用接口和抽象类来实现。举例如下: 
        应用于异步:
//定义一个接口,相当于饭店的通知规范,想要我通知你成功,必须符合规范    
public interface CallBackInterface {
      void notify();
}
public class Restaurant {
      public void service(CallBackInterface callBack){
                   checkseats();
                   if(hasSeat())
                        callBack.notify();
      }
}
//符合饭店规范的我的通知方式
public class  ConsumerNotifier implements CallBackInterface {
        public void notify(){
             giveAPhoneCall();
        
}
 
 

 

     }
public class Consumer{
  public void getService(){
    getInRestaurant();
    Restaurant restaurant = new Restaurant();
    restaurant.service(new ConsumerNotifier());//登记我的通知方式
  }
}
应用于模板:
 
public interface CallBackInterface {
      void execute();//回调方法
}
 
 
public class TestTemplate {
      public void doInTest(CallBackInterface callBack){
            System.out.println("same initilize");
            callBack.execute();
            System.out.println("same release");
      }
      
      public void action1(){
            doInTest(new CallBackInterface(){
            public void execute(){
                  System.out.println("action1");
            };
            });
      }
      
      public void action2(){
            doInTest(new CallBackInterface(){
            public void execute(){
                  System.out.println("action2");
            };
            });
      }
      
      public static void main(String args[]){
            TestTemplate t = new TestTemplate();
            t.action1();
            t.action2();
      }
}
 
输出结果:
 
     same initilize
     action1
     same release
     same initilize
     action2
     same release
 
action1 ,action2为两个不同功能的函数,但是他们具有完全相同的部分(一般为相同的初始化 和清理工作)和不同的部分。如hibernate操作中都有获得sessionFactory 创建session等操作,CRUD完了之后,都有关闭session等操作。这是相同的部分。不同的部分就是具体的CRUD工作。那么我们就可以如例子一样在doInTest里面写好创建session和结束session的工作。CRUD操作则使用同样的接口。而如action1,和action2 一样 提供对外的CRUD接口则只关注具体操作 而不用管session的管理工作了。大家可以参见下 hibernateTemplate
  回调的体现
此时的调用者是action1方法,被调用者是doInTest方法。action1方法调用doInTest方法,同时提供了callBackInterface的实现。被调用者doInTest中又调用了调用者action1所提供的callBackInterface的实现中的execute方法
三. 总结:
  回调单纯来讲只是一种调用模式和该概念,抛开其应用场景来讲是没有意义的。其应用场景主要有异步和模板方法两种,着重点分别在于回调的时间以及回调函数的多样性。在C语言和Java语言两种场景有着不同的实现方式。我们在实际学习中更多的是注重应用场景并思考回调函数在应用场景中所带来的好处,并且思考在实际应用中使用的那些技术使用了回调函数(如hibernateTemplate,事件通知机制等)
    
            
      
 
  • 大小: 8.8 KB
  • 大小: 40.7 KB
分享到:
评论

相关推荐

    浅谈JAVA回调机制1

    Java回调机制是一种编程概念,其核心在于一个对象(A)调用另一个对象(B)的方法,而这个方法内部又反过来调用A对象的另一个方法,形成一种链式反应。回调在多线程、异步处理和事件驱动编程中非常常见,因为它允许...

    浅谈iphone中第三方对象回调的方法

    浅谈iphone中第三方对象回调的方法的文档,有需要的人请仔细阅读

    浅谈ElementUI中switch回调函数change的参数问题

    官方文档中对switch组件的change事件作了基本的描述,但是在多个switch组件共用同一个change回调函数时,无法直接获取到触发事件的switch组件实例,这会带来一定的困扰。官方文档中也明确指出,回调函数的参数是新...

    应用笔记LAT1241+浅谈STM32库里的回调函数

    ### 回调函数在STM32固件库中的应用与理解 #### 一、回调函数的概念 回调函数在编程领域中是一种重要的编程模式,尤其在嵌入式系统开发中经常被使用。它指的是一个由事件驱动或其他函数调用时才会执行的函数。简单...

    浅谈C++模板实现模块间参数传递及回调

    一篇关于C++模板 设计模式 软件架构的文档,里面实现了一个泛化的命令模式和观察者模式

    浅谈jquery回调函数callback的使用

    回调函数在JavaScript和jQuery中扮演着重要的角色,特别是在处理异步操作和动画效果时。回调函数是一种编程技术,用于在某个任务完成之后执行特定的代码块。在jQuery中,回调函数常常与事件处理、动画效果和Ajax请求...

    浅谈javascript回调函数

    JavaScript中的回调函数是一种常见且重要的编程模式,尤其在异步编程中发挥着核心作用。回调函数的基本概念是将一个函数作为参数传递给另一个函数,以便在特定条件满足时执行。这种设计模式允许我们延迟执行代码,...

    浅谈js中的回调地狱问题

    在JavaScript中,回调地狱是一个常见的问题,特别是在处理异步操作时。回调地狱指的是当多个异步操作通过嵌套的回调函数来实现时,形成的难以理解和维护的代码结构。这种模式通常出现在需要依次执行一系列依赖于前一...

    浅谈CSS3动画的回调处理

    在本文中,我们将深入探讨如何在CSS3动画中实现回调处理。回调处理在JavaScript编程中非常常见,它允许我们在特定事件发生后执行某些代码,例如动画结束时。CSS3提供了两种方式来处理动画的回调:`transition`和`...

    浅谈vue使用axios的回调函数中this不指向vue实例,为undefined

    今天在vue-cli脚手架搭建的项目中使用axios时,遇到无法解析this.$route的报错信息,最后发现是作用域的问题。 1.解决方法:使用 => 原代码: axios.get('/user', { params: { ID: 12345 } ...

    浅谈中央空调系统节能改造要点.docx

    造控制。风机是中央空调系统中耗能大户,其运行状态直接影响到整个系统的能效比。在进行变频改造时,可以根据风道阻力和送风量的需求动态调整风机转速,以此来平衡压力和流量,避免过度能耗。通过安装变频器,风机...

    浅谈中央空调系统自控技术应用.docx

    - 若不具通讯功能,可通过流量计、供回水压差变送器和温度传感器对风机盘管进行分组控制,确保水流和温度的稳定。 综上所述,自控技术在中央空调系统中的应用显著提升了系统运行的智能化和能效比,通过对冷热源、...

    浅谈中央空调系统节能改造要点_1.docx

    造控制。风机是中央空调系统中消耗电力的重要部分,对其进行变频改造可以显著降低能耗。根据实际负荷需求调整风机转速,避免不必要的能量浪费。当室内空气需求量减少时,降低风机速度,反之则提高,以此维持室内环境...

    从工程实例浅谈中央空调系统消音降噪处理.docx

    此外,安装了整体回风箱,将风机盘管电机置于消声环境中,进一步降低噪音。同时,对风机盘管的支吊架进行减震处理,使用氯丁橡胶包裹以减少振动传播。经过这些措施,最终噪音值稳定在28dB以下,达到了预期效果。 总...

    浅谈PCI驱动开发.docx

    `module_init`和`module_exit`宏定义了驱动的加载和卸载入口,`pci_driver`结构体定义了驱动的属性和回调函数。 总的来说,Linux PCI驱动开发需要理解内核如何管理PCI设备,同时根据硬件特性编写设备驱动,确保设备...

    浅谈中央空调系统的节能设计-安全管理-行业安全-机械安全.docx

    目前大多数空调水系统采用的是定流量设计,设计水流量基于最大冷负荷和5°C的供回水温差。然而,在实际运行过程中普遍存在大流量小温差的现象,这导致了实际流量远大于设计流量的情况,从而增加了水泵的电耗。 针对...

    浅谈循环流化床锅炉节能降耗

    循环流化床锅炉是一种高效、环保的燃煤锅炉技术,其特点在于燃料和床料在锅炉中呈流态化分布。这类锅炉在降低能耗和减少污染排放方面具备明显优势,因此在全球范围内受到了广泛关注和应用。 在性能特点方面,循环流...

Global site tag (gtag.js) - Google Analytics