`
ouqi
  • 浏览: 41401 次
  • 性别: 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
分享到:
评论

相关推荐

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

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

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

    今天小编就为大家分享一篇浅谈ElementUI中switch回调函数change的参数问题,具有很好的价值,希望对大家有所帮助。一起跟随小编过来看看吧

    浅谈JAVA回调机制1

    当然,即使开头的关于回调的英文概念被翻译成了中文,不少人仍觉得难以理解简单来说,回调就是 A 类调用 B 类中的 X 方法,B 类中的 X 方法执行过程中反过来

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

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

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

    有人对 STM32 固件库里的回调函数有些好奇甚至纠结,这里简单介绍下。其实从用法及功能上讲他们并没有什么特别的,跟其它函数一样,也是实现特定功能的代码段。一般来讲,所谓回调函数,泛指基于事件触发而被调用...

    浅谈jquery回调函数callback的使用

    回调函数必须是全局函数或者静态函数,不可定义为某个特定的类的成员函数 callback函数在当前动画100%完成之后执行 代码如下: $(“p”).hide(1000); alert(“the paragraph is now hidden”); <!–未...

    浅谈js中的回调地狱问题

    回调地狱 由多层嵌套的回调函数组成的代码称为回调地狱,多数在写阻塞执行代码的时候会产生。回调地狱的代码可读性差,很难让人弄清楚业务逻辑。 下面便是回调地狱的代码: function callbackFn(callback){ ...

    浅谈CSS3动画的回调处理

    下面小编就为大家带来一篇浅谈CSS3动画的回调处理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    浅谈javascript回调函数

    这个函数就是所谓的回调函数 经常遇到这样一种情况,某个项目的A层和B层是由不同的人员协同完成.A层负责功能funA,B层负责funcB。当B层要用到某个模块的数据,于是他对A层人员说,我需要你们提供满足某种需求的数据,你...

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

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

    浅谈Java中向上造型向下造型和接口回调中的问题

    主要介绍了浅谈Java中向上造型向下造型和接口回调中的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    浅谈原生JS实现jQuery的animate()动画示例

    本文介绍了浅谈原生JS实现jQuery的animate()动画示例,希望此文章对各位有所帮助。 参数介绍: obj 执行动画的元素 css JSON数值对,形式为“{属性名: 属性值}”,指要执行动画的书序及其对应值 ...

    浅谈大倾角综采工作面回采技术

    大倾角综采工作面运输机和液压支架的下滑属于常见现象,回采过程中,由于管理不到位出现支架的倾倒,造成支架挤架、咬架,使支架拉移困难。针对其产生的原因,以及对生产造成的影响,提出在大倾角工作面采用调伪斜为主的...

    浅谈液压转盘道在综采工作面安装及回收中的应用

    综采工作面每年安装及回收任务比较频繁,机械转盘道在调向过程中操作极不方便,环节多、隐患多,安全系数低,为改进上述缺点,灵新煤矿设计了液压转盘道进行调向及阻车、闭锁装置,在多个综采工作面安装及回收使用中取得了...

    浅谈js promise看这篇足够了

    但是也有一个不好的地方,当我们有很多回调的时候,比如这个回调执行完需要去执行下个回调,然后接着再执行下个回调,这样就会造成层层嵌套,代码不清晰,很容易进入“回调监狱”,就容易造成下边的例子: ...

Global site tag (gtag.js) - Google Analytics