`

java回调机制的通俗理解[转]

    博客分类:
  • java
阅读更多

      回调:类A调用类B的b方法,而在b方法执行过程中,b方法又调用了类A的a方法,这个过程就叫做回调,而方法a就叫回调函数。(自己的理解)

      一般来说,类A不会调用方法a,他只提供方法a供类B调用,由于类B不知道类A中的方法a是长的什么样,所以类B会跟类A约定好接口规范(函数原型),这样,类A会通过类B的一个方法r,告诉类B,我要调用你的方法b,这个过程就叫做回调函数的注册,这方法r就是一个注册函数。

 

现实的例子:

其实回调,简单的可以说是:将自己的引用传给别的方法,在别的方法里面,通过自己的引用调用自己的方法。

将电话号码(自己的引用)给朋友,朋友再打电话(调用自己引用的方法)回拨给自己

应用场景:模版方法很常用

 

java回调机制的通俗理解

 

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

          Ajax代码:

Java代码 复制代码
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模式合用的简单与灵活,这里只是利于理解一点。

 

分享到:
评论
1 楼 断言的矫情 2011-04-09  
execute改成private方法会好点

相关推荐

Global site tag (gtag.js) - Google Analytics