`
lijiejava
  • 浏览: 263654 次
  • 性别: Icon_minigender_1
  • 来自: 南通
社区版块
存档分类
最新评论

java回调机制的通俗理解

阅读更多
        回调的通俗理解:你有一个复杂的问题解决不了,打电话给你的同学,你的同学说可以解决这个问题,但是需要一些时间,那么你不可能一直拿着电话在那里等,你会把你的电话号码告诉他,让他解决之后打电话通知你。即回调就是体现在你的同学又反过来拨打你的号码。 拿这个例子类比Ajax中的回调机制以及Spring中HibernateTemplate用到的回调+模板机制,可以更容易地理解回调机制。

          Ajax代码:

function test{
   if(window.ActiveXObject){
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
   }else if(window.XMLHttpRequest){
      xmlHttp = new XMLHttpRequest();
   }
   xmlHttp.onreadystatechange = callback;
   xmlHttp.open(…);
   xmlHttp.send(null);
}  

function callback{ }   


其中xmlHttp.onreadystatechange = callback 就是表示在state改变时调用callback函数,而这个callback就是一个回调函数。

类比:xmlHttp发出请求就相当于你打电话给你的同学,xmlHttp不知道state何时发生变化,就相当于你不知道你的同学何时能解决问题。Callback函数就相当于你的电话号码,
state发生变化时会调用callback函数,同样你的同学解决问题后会打电话通知你。


Spring中HibernateTemplate的回调机制与模板方法

HibernateTemplaet的源码很复杂,我们可以写一段简单的代码来模拟一下:

interface CallBack{ 
	public void doCRUD(); 
}

public class HibernateTemplate { 
	
	public void execute(CallBack action){
		getConnection();
		action.doCRUD();
		releaseConnection();
	}
 
	public void add(){
		 execute(new CallBack(){
			public void doCRUD(){
				System.out.println("执行add操作...");
			}
		 });
	}
	
	public void delete(){
		 execute(new CallBack(){
			public void doCRUD(){
				System.out.println("执行delete操作...");
			}
		 });
	} 

	public void getConnection(){
		System.out.println("获得连接...");
	}
	
	public void releaseConnection(){
		System.out.println("释放连接...");
	}
	
}



类比:execute方法可以体现出模板模式。以add方法为例,调用execute方法就相当于你打电话给你的同学,但是你的同学说需要时间,就像execute方法需要首先获得连接一样,于是你把CallBack匿名类传递给它,在它获得连接之后会执行你的add操作,这就相当于你把电话号码告诉你的同学,他解决问题之后再打给你一样。当然这种通俗理解不能很好地体现出Spring中的Callback模式和Template模式合用的简单与灵活,这里只是利于理解一点。
分享到:
评论
34 楼 unsid 2011-01-13  
楼主的故事挺通俗,但是表达的不够准确啊。。“你有一个复杂的问题解决不了”和你后面的代码不是一个意思,不是这个问题解决不了采用回调,而是“你能解决一个复杂的问题,但是你不确定其中的某些细节,所以别人在让你解决这个复杂问题的同时,需要把细节告诉你”这样解释才符合你下面的代码。
33 楼 finallygo 2011-01-12  
crud0906 写道
感觉跟AJAX回调不能扯到一块说,AJAX回调关键是要体现它的异步作用,这个例子只体现了模板方法,也就是多态

支持这种观点,hibernateTemplate中的回调只是模板方法模式的变形,简单的说就是封装了方法
32 楼 cwc1983 2011-01-11  
楼主说的通俗易懂。不过感觉不同语言从技术方面理解起来还是有一定的区别。
31 楼 crud0906 2010-08-04  
感觉跟AJAX回调不能扯到一块说,AJAX回调关键是要体现它的异步作用,这个例子只体现了模板方法,也就是多态
30 楼 infinite 2010-08-04  
java回调,更像js里的 传递“方法对象”,java里方法不能作为其他方法的参数来传递,只好把自己所在对象的引用传递过去。
29 楼 mootools215 2010-08-04  
形似神不似,跟ajax回调还是有区别的,后面的例子只是简单的调用下方法
28 楼 shadowlin 2010-08-04  
感觉java里面只要用了接口就算是回调了吧。还是js里面的回调用起来爽一点。。
27 楼 pangyi 2010-08-04  
lijiejava 写道
pangyi 写道
请教下:回调是异步的还是同步的?
如果是同步的话,是不是就失去了回调的意义?


个人认为回调只是一种调用模式,Ajax应该是“异步+回调”,就是页面发出请求后不用等待响应就先处理自己的事情,可以防止页面无法响应等问题。而HibernateTemplate中的回调中应该没有异步,只是为了能够结合模板方法采用的一种调用方式。如果不采用回调,那么我们进行增删改查都需要继承模板类。采用“回调+模板”就具有很大的灵活性。此处将HibernateTemplate进行类比,是为了便于理解。

http://lijiejava.iteye.com/blog/667644

http://wenku.baidu.com/view/c98ac10590c69ec3d5bb7532.html



多谢你的回复!
26 楼 nakupanda 2010-08-04  
我看完java例子程序居然感觉不到callback的存在-____________- 我太蠢了

给execute方法传递一个匿名类能对HibernateTemplate类作什么样的callback处理呢?
25 楼 ztcwh 2010-08-04  
讲得好,赞一个。
24 楼 tophack 2010-08-04  
比较到位,学习了,非常感谢!
23 楼 笑我痴狂 2010-08-03  
讲的浅显易懂  不错
22 楼 313516963 2010-08-03  
LZ,讲的有点太简单
21 楼 terrylrvin 2010-08-03  
就是执行完程序之后 告诉一下该程序的调用者。
20 楼 czxiyj 2010-08-03  
很好懂的,例子不错,不过回调机制本身也好理解!
19 楼 hardPass 2010-08-03  
pangyi 写道
请教下:回调是异步的还是同步的?
如果是同步的话,是不是就失去了回调的意义?



或者是这么说: 阻塞还是非阻塞?

非阻塞当然效率高,但有的时候,需要阻塞。



我就遇到过这样的情况:

1个页面有若干个异步访问:a, b, c, d, e, f

a, b, c, d, e 同时执行,并且在a,b,c, d, e都返回的情况下才执行 f的异步访问。

到了f这里就必须是阻塞的。

并且执行完f ,才允许进行其他操作.
18 楼 smiky 2010-08-03  
相信大家写代码都知道这么写
17 楼 lijiejava 2010-08-03  
pangyi 写道
请教下:回调是异步的还是同步的?
如果是同步的话,是不是就失去了回调的意义?


个人认为回调只是一种调用模式,Ajax应该是“异步+回调”,就是页面发出请求后不用等待响应就先处理自己的事情,可以防止页面无法响应等问题。而HibernateTemplate中的回调中应该没有异步,只是为了能够结合模板方法采用的一种调用方式。如果不采用回调,那么我们进行增删改查都需要继承模板类。采用“回调+模板”就具有很大的灵活性。此处将HibernateTemplate进行类比,是为了便于理解。

http://lijiejava.iteye.com/blog/667644

http://wenku.baidu.com/view/c98ac10590c69ec3d5bb7532.html
16 楼 cswcfs 2010-08-03  
对于初学者来说 这是很好的解释 只是深入的说 有的东西 讲得是不正确的
15 楼 Wuaner 2010-08-03  
Mark
谢楼主

相关推荐

    最牛的Ajax实例通俗易懂

    5. **处理响应**:在回调函数中,通过检查`readyState`和`status`属性判断请求是否成功,然后读取`responseText`或`responseXML`获取数据。 这个实例可能包含以下内容: - **DWR(Direct Web Remoting)**:DWR是...

    groovy 经典入门 通俗易懂

    - Groovy支持闭包,这是一种强大的函数式编程工具,可以用于实现回调、迭代等功能。 3. **脚本编程** - Groovy可以作为脚本语言运行,无需主类或者main方法。这使得它非常适合编写简单的任务脚本或者自动化测试。...

    DWR中文文档,通俗易懂,新手进!

    `Call`主要用于单个方法调用,而`Execute`则适合批量调用或执行有回调函数的方法。 5. **安全性**:DWR通过白名单机制来限制JavaScript可以访问的Java类和方法,防止恶意攻击。开发者需要在配置文件中指定允许的...

    从根上理解高性能、高并发(六):通俗易懂,高性能服务器到底是如何实现的-其它分享_专项技术区 - 即时通讯开发者社区!.pdf

    - **异步I/O** 调用立即返回,操作系统负责处理数据准备,当数据就绪时,通过回调或事件通知应用程序。异步I/O能提高系统吞吐量,尤其在高并发场景下。 5. **协程** - **协程** 是轻量级的线程,用户态的上下文...

    McGraw.Hill.How.to.Do.Everything.with.JavaScript.eBook-DDU

    4. **异步编程**:讲解事件循环、回调函数、Promise、async/await等处理异步操作的方法,帮助开发者理解和解决JavaScript的回调地狱问题。 5. **DOM操作**:如何通过JavaScript来操作文档对象模型(DOM),实现页面...

    用最通俗易懂的代码帮助新手理解javascript闭包 推荐

    这种将函数作为参数传递的机制称为回调函数,常用于异步编程和事件处理。 2. **函数作为返回值**: 函数可以返回另一个函数。当一个函数执行完毕并返回一个函数实例时,这个返回的函数仍然可以访问其外部函数的...

    Hibernate 参考文档

    - **特点**:相较于其他中文技术书籍,本书语言通俗易懂,易于理解。 #### 二、体系结构 - **总览**:介绍了Hibernate框架的整体架构设计,包括核心组件如SessionFactory、Session等的功能及交互方式。 - **JMX集成...

    C_入门经典(2005)--第一部分(下)

    结合事件机制,可以实现回调和异步编程,常见于GUI应用和多线程编程。 10. **泛型**:泛型允许创建可重用的类型,如泛型类、接口和方法,以提高代码的灵活性和效率。 11. **LINQ(Language Integrated Query)**:...

Global site tag (gtag.js) - Google Analytics