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

相关推荐

    什么是回调函数(最通俗的讲解+实例分析).pdf

    尽管回调机制通常被简化为两个函数之间的交互,但实际上,起始函数在这个过程中起到了关键的作用,它决定了何时以及如何使用回调。 回调函数在很多场景下都有应用,比如事件处理、异步编程、数据处理等。它们让代码...

    一张图让你通俗易懂得理解java反射机制!

    一张图让你通俗易懂得理解java反射机制!

    回调函数讲解

    ### 回调函数详解 #### 一、回调函数的基本概念 在计算机编程中,回调函数是一种特殊的函数,它被作为参数...通过理解和掌握回调函数的工作原理及其应用场景,开发者可以更高效地解决问题并构建出高质量的软件产品。

    源码通俗讲解Java绘图功能机制以及绘图框架的源码

    通俗讲解Java绘图功能机制以及绘图框架的源码

    Java开发中名词的通俗解释共2页.pdf.zip

    这份名为“Java开发中名词的通俗解释共2页.pdf”的压缩文件,显然提供了一份简明扼要的Java编程术语解析,旨在帮助初学者或有经验的开发者更好地理解Java开发中的关键概念。虽然压缩包中似乎还有一个名为“赚钱项目...

    基础java讲解通俗易懂

    在编译阶段,Java源代码文件(.java)被编译成字节码文件(.class),这些字节码文件由JVM解释执行。Java环境变量配置包括设置JAVA-HOME环境变量,指向JDK的安装目录,以及配置Path和ClassPath环境变量,以便操作...

    java与设计模式--通俗易懂的介绍

    本篇将通俗易懂地介绍几种常见的设计模式,并提供相关的Java代码示例。 首先,设计模式主要分为三大类:创建模式、结构模式和行为模式。 **创建模式**关注的是对象的创建。例如: 1. **工厂模式**(Factory ...

    23种设计模式JAVA实现,例子通俗易懂

    本资源提供了23种设计模式的Java实现,通过具体的代码示例帮助开发者深入理解并掌握这些模式。 1. **单例模式(Singleton)**:确保一个类只有一个实例,并提供全局访问点。防止多线程环境下多个实例的产生,常用于...

    【白盒测试通俗解释及设计方法】白盒测试通俗解释及设计方法

    白盒测试白盒测试通俗解释及设计方法白盒测试通俗解释及设计方法白盒测试通俗解释及设计方法白盒测试通俗解释及设计方法白盒测试通俗解释及设计方法白盒测试通俗解释及设计方法白盒测试通俗解释及设计方法白盒测试...

    通俗易懂的javaIO讲解

    ### 通俗易懂的Java IO讲解 在Java中,输入输出流(IO)是一个非常重要的概念,它涉及到了数据如何从一个地方传输到另一个地方。本文将深入浅出地介绍Java IO的基础概念,并通过实例帮助读者更好地理解这些概念。 ...

    通俗易懂的java设计模式

    本资源“通俗易懂的Java设计模式”旨在帮助初学者和有一定经验的开发者更好地理解和应用这些模式。 首先,设计模式的基本分类包括创建型、结构型和行为型三大类。创建型设计模式如单例(Singleton)、工厂方法...

    Java零基础学习视频通俗易懂

    2. **环境配置**:学习Java的第一步通常是安装Java Development Kit (JDK),并设置好环境变量JAVA_HOME和Path,以便在命令行中运行Java编译器`javac`和解释器`java`。 3. **语法基础**:Java的基础语法包括变量声明...

    21天学通JAVA 更通俗意懂

    这套教程以其通俗易懂的语言和丰富的实例,深受广大JAVA学习者的喜爱。下面我们将深入探讨教程中的关键知识点。 1. **JAVA基础语法**:在第一天的学习中,通常会介绍JAVA的基本结构,包括如何编写第一个"Hello, ...

    JAVA教程通俗易懂不啰嗦

    很详细 又不啰嗦的 ppt教程 通俗易懂不啰嗦

    Java设计模式----通俗易懂版

    这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...

    Java反射机制.txt

    ava反射机制 概述:通俗地讲Java反射就是通过类名获得类的实例的方法。java.lang.reflect提供了实现Java反射的API。

    网关的最通俗解释

    网关的最通俗解释 迅速理解什么是网关及网关的作用

    PID调节的通俗化理解

    鉴于此,本文力争以通俗的语言讲解PID的各个含义。 PID控制是自动化控制领域应用非常广的控制方式,P代表比例,I代表积分,D代表微分,从这些名词中可以看出,PID控制是基于数学中一项重要的分支:微积分学为基础的...

    Java2048 Java编写的2048小游戏 通俗易懂

    Java2048是一款基于Java编程语言开发的2048小游戏,它的设计简洁明了,界面风格优雅,且具有良好的用户体验。...通过分析和理解这个项目的源代码,可以深入理解Java语言的特性和游戏开发的基本流程。

Global site tag (gtag.js) - Google Analytics