`
lijiejava
  • 浏览: 259130 次
  • 性别: 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
谢楼主

相关推荐

Global site tag (gtag.js) - Google Analytics