“if you call me, i will call back”,说白了,就是有相互依赖关系的两个类之间的互相调用
package callBack;
publicclassContextimplementsA.Callback{
privateAa;
publicvoidbegin(){
System.out.println("begin...");
}
publicvoidend(){
System.out.println("end...");
}
publicContext(){
this.a=newA(this);
}
publicvoiddoSomething(){
this.a.doIt();
}
publicstaticvoidmain(Stringargs[]){
newContext().doSomething();
}
}
package callBack
publicclassA{
privatefinalCallbackcallback;
publicstaticinterfaceCallback{
publicvoidbegin();
publicvoidend();
}
publicA(Callbackcallback){
this.callback=callback;
}
publicvoiddoIt(){
callback.begin();
System.out.println("dosomething...");
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 callBack;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
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 {
ResultSet rs=conn.createStatement().executeQuery(sql);
while(rs.next()){
System.out.print(rs.getInt("id")+"\t");
System.out.print(rs.getString("userName")+"\t");
System.out.print(rs.getString("email")+"\t");
System.out.print(rs.getString("passWord")+"\t");
System.out.print(rs.getString("address")+"\t");
System.out.print(rs.getString("sex")+"\t");
System.out.print(rs.getString("work")+"\t");
System.out.println();
}
return rs;
}
}
);
}
public Connection openConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/blog", "root", "root");
}
public void closeConnection(Connection conn) throws SQLException {
if(conn != null && !conn.isClosed()) {
conn.close();
}
}
public static void main(String[] args){
Dao dao=new Dao();
try{
String sql="select * from user";
Class.forName("com.mysql.jdbc.Driver");
dao.sqlQuery(sql);
}catch(Exception e){
e.printStackTrace();
}
}
}
用这种回调模式方便的把openConnection()和closeConnection()做了切片,从代码中剥离出来,使代码复用性更高,也更简洁
分享到:
相关推荐
本实例将聚焦于Java版本的实现,通过深入理解回调模式,我们可以更好地构建稳定、高效的微信企业号应用。 首先,我们要明白微信企业号回调的基本原理。当微信企业号接收到特定事件(如用户关注、取消关注、消息发送...
企业微信回调模式建立连接需要的java类和jar包,JAVA方面的代码, 包含7个java类和一个jar包,企业微信回调模式建立连接需要的java类和jar包,JAVA方面的代码, 包含7个java类和一个jar包
本案例将详细讲解如何使用Java来实现企业微信的回调配置,并提供相关的工具代码示例。 1. **企业微信API介绍** 企业微信提供了丰富的API接口,包括但不限于用户管理、部门管理、消息推送等。回调配置主要是通过...
在软件工程中,**回调**是一种常见的编程模式,它允许程序的某部分代码指定一个方法,然后由其他部分的代码在适当的时机调用这个方法。简单来说,即一个对象A调用另一个对象B中的某个方法后,对象B会在某个时刻调用...
本话题将深入探讨如何在Android中使用JNI进行多线程编程,并实现native方法对Java函数的回调。 1. **JNI基础知识**: - JNI是Java平台的一部分,为Java应用程序提供了与本地代码交互的能力。开发者可以通过JNI在...
在这个场景中,JNI被用来实现Java程序对摄像头的控制,以及处理来自C代码的回调。 首先,我们需要理解JNI的工作原理。JNI提供了一套接口,使得Java代码可以生成本地方法调用,这些方法可以是用C或C++编写的。在Java...
Java回调函数是一种编程模式,允许程序员在程序中定义一个函数,并将其传递给另一个程序,以便在需要时被调用。这种编程模式广泛应用于Java中,特别是在事件驱动编程、异步编程和多线程编程中。 在Java中,回调函数...
在本文中,我们将深入探讨如何在SpringBoot框架中进行海康威视SDK的二次开发,特别是关于报警回调功能。海康威视是全球知名的安防设备供应商,其SDK为开发者提供了丰富的功能,允许我们与监控设备进行高效交互。而...
在Java通过JNA调用DLL时,如果DLL函数需要一个回调函数作为参数,那么Java需要定义一个接口,该接口的方法将作为回调函数的实现,JNA会处理这个接口的调用转换。 4. **Spring Boot**:Spring Boot是基于Spring框架...
这几天搞搞JNA,主要是组内...C++部分使用ACE实现了一个线程,线程中调用Java部分的回调函数。 C++使用vc8开发,代码跨平台,不过偷懒,没写makefile, 其中使用了ACE这个库。 Java部分,使用eclipse。jdk1.5版本。
Java设计模式
本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...
Java 模板方法设计模式定义 Java 模板方法设计模式是指在软件...Java 模板方法设计模式是通过回调机制来实现算法的可扩展性和灵活性的设计模式。该模式的使用场景广泛,例如在 Web Service 和 RMI 等领域都有应用。
本项目为Android平台上的简单回调机制设计源码,包含42个文件,涵盖15个XML配置、10个PNG图片、5个Java源代码、3个Gradle构建脚本、2个Git忽略规则、2个属性设置以及少量其他文件。该示例旨在展示Android开发中的回...
标题"android 传值回调"主要涉及的是在Android应用程序的不同Activity之间传递数据以及使用回调方法来处理这些数据的方式。本篇文章将详细探讨Android页面传值的各种策略和技术。 首先,最基本的页面传值方式是使用...
所涉及的设计模式包括工厂模式、单例模式、建造模式、原型模式、适配器模式、桥梁模式、组合模式、装饰模式、门面模式、享元模式、代理模式、责任链模式、命令模式、解释器模式、迭代器模式、调停者模式、备忘录模式...
Java设计模式(第二版)是John Metsker撰写的一本经典图书,主要面向Java开发者,深入讲解了设计模式在软件工程中的应用。设计模式是解决软件设计中常见问题的经验总结,是程序员之间的通用语言,能够帮助我们构建可...
本份帮助文档主要是为了向读者介绍二十三种设计模式,包括模式的描述,适用性,模式的组成部分,并附带有简单的例子和类图,目的是为了让读者了解二十三种设计模式,并能方便的查阅各种设计模式的用法及注意点。