`
cuishen
  • 浏览: 297283 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

浅析java callback 回调模式

    博客分类:
  • j2se
阅读更多
看过spring、hibernate源码的朋友对callback回调模式应该并不陌生,用一句话来概括就是:“if you call me, i will call back”,说白了,就是有相互依赖关系的两个类之间的互相调用,现在看看下面的代码模型:

package com.cuishen.callback;

public class Context implements A.Callback {

	private A a;
	
	public void begin() {
		System.out.println("begin ...");
	}

	public void end() {
		System.out.println("end ...");
	}
	
	public Context() {
		this.a = new A(this);
	}
	
	public void doSomething() {
		this.a.doIt();
	}
	
	public static void main(String args[]) {
		new Context().doSomething();
	}
}


package com.cuishen.callback;

public class A {
	
	private final Callback callback;
	
	public static interface Callback {
		public void begin();
		public void end();
	}
	public A(Callback callback) {
		this.callback = callback;
	}
	public void doIt() {
		callback.begin();
		System.out.println("do something ...");
		callback.end();
	}
}


上面的代码模型其原型是出自hibernate里的org.hibernate.jdbc.JDBCContext 和 org.hibernate.jdbc.ConnectionManager两个类,从上面的模型不难看出:Context类实现了A类的Callback接口,在Context类的构造器里将自己注入了A类,在Context类里调用A类的doIt()方法,这时就是:you call me;在doIt()方法体里调用了Context类的begin()和end()方法,这时就是:i call back。Context类 和 A类相互依赖,互相调用

在hibernate的源代码里大量使用了上面的callback回调模型,又如:org.hibernate.jdbc.JDBCContext 和 org.hibernate.impl.SessionImpl等等,可以自己去看源代码,这里不再赘述。

当然上面提到的模型中的两个类也可以写在同一个类里面,定义的Callback接口可以用内部匿名类来实现,比如下面的一个简单的dao实现:

package com.cuishen.callback;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Dao {
	private interface Callback {
		Object doIt(Connection conn) throws SQLException;
	}
	private Object execute(Callback callback) throws SQLException {
		Connection conn = openConnection(); // 开启数据库连接
		try { return callback.doIt(conn); } // 执行具体操作并返回操作结果
		finally { closeConnection(conn); } // 关闭数据库连接
	}
	
	public Object sqlQuery(final String sql) throws SQLException {
		return execute(
			new Callback() {
				public Object doIt(Connection conn) throws SQLException {
					return conn.createStatement().executeQuery(sql);
				}
			}
		);
	}
	
	public Connection openConnection() throws SQLException {
		return DriverManager.getConnection("", null);
	}
	public void closeConnection(Connection conn) throws SQLException {
		if(conn != null && !conn.isClosed()) {
			conn.close();
		}
	}
}


用这种回调模式方便的把openConnection()和closeConnection()做了切片,从代码中剥离出来,使代码复用性更高,也更简洁

分享到:
评论
1 楼 summeryhrb 2009-08-03  
更准确的说是一种模板技巧,不要从callback字面理解,就像ioc,从字面上理解不出来的,而这种模板技巧是gof模式中的模板模式做不到的,最经典的就是spring的JDBCTemplate

相关推荐

    java CallBack(回调函数)

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

    C++中回调函数(CallBack)的用法分析

    本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 其错误是普通的C++成员函数都隐含了一个传递...

    callback回调函数

    Callback回调函数作为一种重要的编程模式,在各种编程语言和框架中都有广泛的应用。理解和掌握回调函数的工作原理及使用方法对于提高程序设计能力具有重要意义。无论是进行事件处理、异步编程还是多线程编程,合理...

    基于鸿洋okhttputils 封装数据 bean和callback 回调

    本主题主要探讨的是如何基于鸿洋的OkHttpUtils进行数据Bean的封装以及Callback回调的处理。 首先,我们来理解一下OkHttpUtils的核心概念。OkHttpUtils提供了一系列静态方法,如`get()`, `post()`等,用于发起HTTP...

    给初学者的java回调demo

    Java回调是一种设计模式,它是当一个对象调用另一个对象的方法时,被调用对象通过某种方式在完成操作后反过来调用调用者的方法,这种机制就是回调。在Java中,回调通常通过接口或者抽象类来实现。这篇"给初学者的...

    CallBack回调

    回调(Callback)是编程中一个重要的概念,尤其是在异步编程中。回调函数是一种将功能作为参数传递给另一个函数,以便在特定事件发生或任务完成后执行的编程技术。回调的使用可以解决程序执行顺序的问题,特别是在...

    微信企业号回调模式实例(Java版)

    在微信企业号的应用开发中,回调模式是一种关键的交互机制,它使得企业号可以与外部系统进行实时的数据同步和通信。本实例将聚焦于Java版本的实现,通过深入理解回调模式,我们可以更好地构建稳定、高效的微信企业号...

    Java中回调方法使用范例

    在Java编程中,回调方法是一种设计模式,它允许我们在代码执行过程中插入自定义的行为,特别是在异步编程或者事件处理中非常常见。...进一步研究这些文件将有助于加深对Java回调方法的理解和实践。

    Android java 回调例子

    相信很多初学android java的童鞋们都不太懂回调的意思,我当时也是这样的什么这个跳到那个然后又从那个调用这个的方法。。。弄得晕头转向的,今天我突然顿悟,于是写了一个回调例子与大家分享,由于手头分不多了,...

    java自定义回调函数

    在Java中,我们可以使用接口或者匿名内部类来实现回调机制。 首先,我们需要理解什么是回调。回调是一种编程技术,当一个函数执行完毕后,它会调用另一个预先指定的函数,这个被调用的函数就是回调函数。在Java中,...

    Java回调机制

    Java回调机制是软件设计模式中的一种,特别是在Java和Android开发中广泛应用。回调允许服务端对象在执行特定操作后,通知并调用客户端对象的方法。这种机制使得程序可以在异步环境中运行,即服务端处理完一个任务后...

    Java基础核心理解+什么是回调即回调机制讲解

    ### Java基础核心理解+什么是回调及回调机制讲解 #### 一、回调机制的引入与应用场景 在软件开发中,特别是面向对象编程语言如Java中,模块间的交互是至关重要的。根据调用方式的不同,可以将模块间的交互分为三种...

    java接口回调

    在Java编程中,接口回调是一种常见的设计模式,用于实现异步操作或者事件处理。当我们谈论“Java接口回调”时,核心思想是:一个类通过实现特定接口,将自身的某个方法暴露给其他对象调用,当特定事件发生或任务完成...

    JQ Callback 回调函数

    回调函数是JavaScript中的一个重要概念,它允许我们定义在特定事件发生后执行的代码块。在jQuery中,回调函数被广泛应用,尤其是在处理异步操作时。本篇文章将深入探讨jQuery中的回调函数及其应用。 首先,我们需要...

    java中回调函数的简单实现

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

    59丨模板模式(下):模板模式与Callback回调函数有何区别和联系?1

    回调函数和模板模式都是软件设计中用于实现代码复用和扩展的重要工具,它们在不同的场景下各有优势。模板模式是一种行为设计模式,它定义了一组操作的算法骨架,同时允许子类在某些步骤中替换具体行为。而回调则是...

    CallBack回调函数

    回调函数在计算机编程中是一种非常重要的机制,尤其是在异步编程和事件驱动的环境中。回调函数的概念基于函数作为参数传递,允许我们定义一个处理程序,在特定条件满足或某个操作完成时被调用。这种模式在很多编程...

    CallBack_DEMO 回调

    在本示例"CallBack_DEMO"中,我们可能正在探讨如何在Java或其他编程语言中实现回调机制。回调通常与异步编程相关,尤其是在处理I/O操作、网络请求或者时间事件时,它能让程序在执行完成后继续执行后续操作,而不是...

    Callback回调接口学习demo

    在Android开发中,回调接口是一种常见的设计模式,用于在组件之间传递信息,特别是在需要一个组件(如Fragment)通知另一个组件(如Activity)时。在这个"Callback回调接口学习demo"中,我们将深入理解回调接口的...

Global site tag (gtag.js) - Google Analytics