博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析java callback 回调模式
阅读量:7049 次
发布时间:2019-06-28

本文共 2298 字,大约阅读时间需要 7 分钟。

hot3.png

看过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()做了切片,从代码中剥离出来,使代码复用性更高,也更简洁

转载于:https://my.oschina.net/fangshaowei/blog/190779

你可能感兴趣的文章
node.js 在window下安装
查看>>
CentOS 7打开文件中文乱码
查看>>
Winform动态创建控件对DPI的处理
查看>>
new关键字与malloc的区别
查看>>
《Just For Fun》阅读摘抄
查看>>
hibernate4.3.5.Final入门1
查看>>
python 发送邮件模块
查看>>
unqlite安装/使用/测试
查看>>
SQLite 查询或更新上一条插入的数据
查看>>
Ansible 之 roles使用
查看>>
我的友情链接
查看>>
OpenCV+Dlib进行实时脸部检测
查看>>
【Android】简单的日志工具
查看>>
8月初.wang域名总量TOP14:35互联耐思尼克竞争激烈
查看>>
解决wordpress上传文件2M限制
查看>>
读《学习正则表达式》(1)
查看>>
482. License Key Formatting - LeetCode
查看>>
AWK常用命令总结
查看>>
Webkit浏览器点击控件时出现的边框消除
查看>>
python Redis 手册 翻译
查看>>