文章目录
基础概念理解:
什么叫对象间的通信?
通俗来讲,就是a 对象 调用 b 对象的方法(接口)
界定范围:哪些对象的通信?
本地:在同一个jvm内,称为本地对象的方法、接口调用
远程:在不同的jvm中,称为远程的方法、接口调用
对象间通信的方式:
同步:单向,阻塞式的调用
回调:双向(分阻塞、非阻塞两种)
异步:双向,且非阻塞。所以,由此可见,回调和异步通常是成对出现。回调是异步的基础,异步是回调的一种表现形式。
对于回调进行定义:
在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
常见的一些对于回调的偏见或者错误认知
以偏概全:
例一:GUI编程中,一个按钮被点击之后要做点事情,大家可以注册个ActionListener上去监听点击事件,在点击时被调用,这就是一个回调。
例二:例如说java.util.Collections.sort(List, Comparator),这个sort()方法就定义了一个流程实现排序,而具体的顺序则由传入的Comparator参数来确定——这就是回调。
其实,上面两个例子,都没有错。但是,都发生了以偏概全的错误定义。
望文生义:
混淆概念:
当遇到一些IO或者延迟等需要耗用时间的操作,我们一般采用回调的方式来完成。就是你委托JVM或者操作系统做一些事情,他们做好了,就会回调你的方法让你去处理。
小结:那么如何全面认知一个概念,或者说如何科学地给一个概念下定义呢?一般来说,我们定义一个概念,从内涵和外延两个方面进行说明。
内涵(本质)
就是一个可执行代码块的引用,或者说内存地址,或者说是指针,其实都是一回事儿。
(备注:可执行代码块,它有很多别名,例如: 函数/方法/过程/事件对象/委托,这些概念其实都是一回事儿)
外延(相关的概念,延伸的意义)
1、回调和相关设计模式(观察者、访问者、……)的关系:
模式,是通过接口回调的方法实现的,即它是一种回调的体现。
而回调,本身是一种原理,机制。而非具体的实现。
2、与异步同步的关系:回调分为异步的回调、同步的回调。经常和异步成对出现。
3、和事件驱动(event、listener)的关系:回调,是事件驱动编程的实现的基础原理。委托是c#中的概念,其实和匿名函数、java中的函数式接口、接口回调是同一个概念的不同表达形式。他们都是用来实现事件驱动编程(控制框架)的核心。
4、和javaEE的web编程servlet中filter技术的关系:filter技术是回调机制的具体应用场景之一,filter核心技术:基于回调