java回调机制的粗浅理解

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的源码很复杂,我们可以写一段简单的代码来模拟一下:

Java代码  收藏代码

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