`
newleague
  • 浏览: 1493155 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

java回调函数

 
阅读更多

所谓回调,就是客户程序C调用服务程序S中的某个方法a,然后S又在某个时候反过来调用C中的某个方法b,对于C来说,这个b便叫做回调函数。

一般说来,C不会自己调用bC提供b的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的b叫甚名谁,所以S会约定b的接口规范(函数原型),然后由C提前通过S的一个函数r告诉S自己将要使用b函数,这个过程称为回调函数的注册,r称为注册函数。

下面举个通俗的例子:

 

某天,我打电话向你请教问题,当然是个难题,:),你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。

 

这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。

 

如果你还不太清楚看看这段描述合和代码:

 

声明一个接口,另外一个类有方法里面有个参数以是这个接口类型的,而后在另外类中实现这个接口(java中多用的是匿名内部类),而且以这个匿名的类生成的对象为参数传到上面提到类中,而后实现回调.......这种用法可以参考java里面常用到的数据库操作所用到的几个接口.....

 

//声明一个接口

public interface ICallBack {

    void postExec();

}

 

 

//另外一个类有方法里面有个参数以是这个接口类型的

public class FooBar {

    private ICallBack callBack;

    public void setCallBack(ICallBack callBack) {

        this.callBack = callBack;

    }

    public void doSth() {

        callBack.postExec();

    }

}

---------------------------------------

//回调的实现

public class Test {

    public static void main(String[] args) {

        FooBar foo = new FooBar();

        foo.setCallBack(new ICallBack() {

            public void postExec() {

                System.out.println("method executed.");

            }

        });

        foo.doSth();//调用函数

    }

}

=======================================================================================

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

          Ajax代码:

Java代码 复制代码 收藏代码
  1. function test{   
  2.    if(window.ActiveXObject){   
  3.       xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");   
  4.    }else if(window.XMLHttpRequest){   
  5.       xmlHttp = new XMLHttpRequest();   
  6.    }   
  7.    xmlHttp.onreadystatechange = callback;   
  8.    xmlHttp.open(…);   
  9.    xmlHttp.send(null);   
  10. }     
  11.   
  12. function callback{ }     
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代码 复制代码 收藏代码
  1. interface CallBack{    
  2.     public void doCRUD();    
  3. }   
  4.   
  5. public class HibernateTemplate {    
  6.        
  7.     public void execute(CallBack action){   
  8.         getConnection();   
  9.         action.doCRUD();   
  10.         releaseConnection();   
  11.     }   
  12.     
  13.     public void add(){   
  14.          execute(new CallBack(){   
  15.             public void doCRUD(){   
  16.                 System.out.println("执行add操作...");   
  17.             }   
  18.          });   
  19.     }   
  20.        
  21.     public void delete(){   
  22.          execute(new CallBack(){   
  23.             public void doCRUD(){   
  24.                 System.out.println("执行delete操作...");   
  25.             }   
  26.          });   
  27.     }    
  28.   
  29.     public void getConnection(){   
  30.         System.out.println("获得连接...");   
  31.     }   
  32.        
  33.     public void releaseConnection(){   
  34.         System.out.println("释放连接...");   
  35.     }   
  36.        
  37. }  
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模式合用的简单与灵活,这里只是利于理解一点。

分享到:
评论

相关推荐

    java 回调函数 实现

    在Java编程中,回调函数是一种设计模式,它允许一个对象在另一个对象执行特定操作后接收通知或进行处理。这种机制通常用于事件驱动编程或者异步编程中,使得代码能够响应某些特定事件的发生。在给定的场景中,我们...

    Java回调函数的理解

    ### Java回调函数的理解 #### 一、回调函数的概念与应用场景 在计算机编程中,回调是一种常用的编程模式,尤其是在异步编程场景中。简单来说,回调指的是一个函数或方法被另一个函数调用,作为参数传递进去。这种...

    Java回调函数详解共6页.pdf.zip

    Java回调函数是编程中一种常见的设计模式,它允许一个对象在其他对象完成特定操作后进行通知或介入。这种模式在Java中广泛应用于事件处理、异步编程和接口交互。本资料"Java回调函数详解共6页.pdf.zip"将深入探讨这...

    Java 回调函数详解及使用.rar

    Java回调函数是编程中一种常见的设计模式,它允许一个对象在其他对象执行特定操作后接收通知或进行相应的处理。在Java中,回调机制通常通过接口或者实现类来实现,这使得代码具有更好的灵活性和可扩展性。本篇将深入...

    Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种:  直接调用:在函数A的函数体里通过书写函数B的函数名来调用...

    Java 回调函数详解及使用.docx

    下面我们将深入探讨Java回调函数的概念、实现方式以及使用技巧。 首先,理解回调函数的基本原理非常重要。回调函数本质上是一种将控制权转移的技术,使得调用者可以在适当的时间调用被调用者提供的函数。在Java中,...

    Java面试如何用Java实现一个回调函数

    Java面试如何用Java实现一个回调函数

    java自定义回调函数

    Java自定义回调函数是软件开发中的一个重要概念,尤其是在Android和SDK开发中,它极大地提高了代码的灵活性和可扩展性。回调函数允许一个方法在完成特定操作后通知另一个方法,这种设计模式在异步编程和事件处理中...

    Java回调函数实例代码详解

    Java回调函数实例代码详解 Java回调函数是一种编程模式,允许程序员在程序中定义一个函数,并将其传递给另一个程序,以便在需要时被调用。这种编程模式广泛应用于Java中,特别是在事件驱动编程、异步编程和多线程...

    Java 回调函数深入理解

    总的来说,Java回调函数通过接口和对象的交互,实现了代码间的协作,让服务程序可以在特定时刻调用客户程序提供的逻辑,极大地增强了程序的灵活性和可扩展性。理解并熟练运用回调函数是成为高级Java开发者的必备技能...

    Android回调函数的例子

    本示例将深入探讨Java回调函数,并通过一个Android小程序来展示其用法。 首先,理解Java回调函数的基础概念。回调函数本质上是将一个函数作为参数传递给另一个函数,待特定条件满足或特定事件发生时,被调用的函数...

    回调函数被连续执行两次或多次的原因

    ### 回调函数被连续执行两次或多次的原因 在编程领域,回调函数是一种常见的编程模式,它允许将函数作为参数传递给另一个函数,并在适当的时机由后者调用。这种模式非常有用,尤其是在处理异步操作时。然而,在某些...

    java 回调函数的理解

    回调函数在Java编程中是一种常见的设计模式,它允许一个对象在特定事件发生时通知其他对象。这个机制使得代码能够实现异步处理、事件驱动和松耦合,是理解和使用Java库或框架时不可或缺的知识点。回调函数的核心在于...

    Java多线程实现回调函数.txt

    Java多线程实现 自定义 的 回调函数. 手写 完成,亲测 完成,可以 直接运行,Demo ,具有一定参考价值,供大家阅读 下载,谢谢

    java中回调函数的简单实现

    在Java编程中,回调函数是一种设计模式,它允许我们在代码执行过程中插入自定义的行为,特别是在异步编程或者事件处理中非常常见。回调函数的核心思想是将一个函数作为参数传递给另一个函数,然后在适当的时候由被...

    java CallBack(回调函数)

    Java回调函数,也称为Callback机制,是面向对象编程中一种重要的设计模式,它允许一个对象在其他对象执行特定操作后得到通知或者进行后续处理。在Java中,回调通常通过接口来实现,因为Java不支持函数指针。让我们...

    再谈java回调函数

    【Java回调函数详解】 回调函数在编程中是一个重要的概念,尤其在处理异步操作或事件驱动的编程模型中。回调函数本质上是一种设计模式,允许我们将一个函数(或方法)作为参数传递给另一个函数,以便在特定时机被...

    [iOS]Objective-C利用协议实现回调函数(类似java的回调函数)

    在标题提及的“[iOS]Objective-C利用协议实现回调函数(类似java的回调函数)”中,我们主要讨论的是Objective-C如何通过协议(Protocol)来实现类似于Java中的回调函数功能。这种机制对于异步编程、事件处理以及...

Global site tag (gtag.js) - Google Analytics