浅析java callback 回调模式

转自:http://cuishen.iteye.com/blog/438428

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

Java代码   收藏代码
  1. package com.cuishen.callback;  
  2.   
  3. public class Context implements A.Callback {  
  4.   
  5.     private A a;  
  6.       
  7.     public void begin() {  
  8.         System.out.println("begin ...");  
  9.     }  
  10.   
  11.     public void end() {  
  12.         System.out.println("end ...");  
  13.     }  
  14.       
  15.     public Context() {  
  16.         this.a = new A(this);  
  17.     }  
  18.       
  19.     public void doSomething() {  
  20.         this.a.doIt();  
  21.     }  
  22.       
  23.     public static void main(String args[]) {  
  24.         new Context().doSomething();  
  25.     }  
  26. }  
  27.   
  28.   
  29. package com.cuishen.callback;  
  30.   
  31. public class A {  
  32.       
  33.     private final Callback callback;  
  34.       
  35.     public static interface Callback {  
  36.         public void begin();  
  37.         public void end();  
  38.     }  
  39.     public A(Callback callback) {  
  40.         this.callback = callback;  
  41.     }  
  42.     public void doIt() {  
  43.         callback.begin();  
  44.         System.out.println("do something ...");  
  45.         callback.end();  
  46.     }  
  47. }  


上面的代码模型其原型是出自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实现: 

Java代码   收藏代码
  1. package com.cuishen.callback;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.SQLException;  
  6.   
  7. public class Dao {  
  8.     private interface Callback {  
  9.         Object doIt(Connection conn) throws SQLException;  
  10.     }  
  11.     private Object execute(Callback callback) throws SQLException {  
  12.         Connection conn = openConnection(); // 开启数据库连接  
  13.         try { return callback.doIt(conn); } // 执行具体操作并返回操作结果  
  14.         finally { closeConnection(conn); } // 关闭数据库连接  
  15.     }  
  16.       
  17.     public Object sqlQuery(final String sql) throws SQLException {  
  18.         return execute(  
  19.             new Callback() {  
  20.                 public Object doIt(Connection conn) throws SQLException {  
  21.                     return conn.createStatement().executeQuery(sql);  
  22.                 }  
  23.             }  
  24.         );  
  25.     }  
  26.       
  27.     public Connection openConnection() throws SQLException {  
  28.         return DriverManager.getConnection(""null);  
  29.     }  
  30.     public void closeConnection(Connection conn) throws SQLException {  
  31.         if(conn != null && !conn.isClosed()) {  
  32.             conn.close();  
  33.         }  
  34.     }  
  35. }  


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,回调函数(Callback)是一种常见的编程模式回调函数用于在某个特定事件发生时,将控制权交给另一个函数或对象,以执行特定的操作。这种模式通常用于异步编程或事件驱动的编程中。 在Java中,可以通过接口、抽象类或Lambda表达式来实现回调函数。下面是几种常见的实现方式: 1. 使用接口: - 定义一个回调接口,其中包含一个回调方法。 - 在需要执行回调的类中,将需要回调的对象作为参数传入,并调用回调方法。 2. 使用抽象类: - 定义一个抽象类,其中包含一个抽象的回调方法。 - 在需要执行回调的类中,继承该抽象类并实现回调方法。 3. 使用Lambda表达式(Java 8及以上版本): - 定义一个函数式接口,其中包含一个抽象的回调方法。 - 在需要执行回调的地方,使用Lambda表达式创建接口的实例并实现回调方法。 以下是一个使用接口实现回调函数的示例代码: ```java // 定义回调接口 interface Callback { void onCallback(); } // 执行回调的类 class Caller { void doSomething(Callback callback) { // 执行某些操作 System.out.println("Doing something..."); // 执行回调 callback.onCallback(); } } // 使用回调的类 class CallbackHandler implements Callback { @Override public void onCallback() { System.out.println("Callback executed!"); } } // 测试代码 public class Main { public static void main(String[] args) { Caller caller = new Caller(); CallbackHandler callbackHandler = new CallbackHandler(); caller.doSomething(callbackHandler); } } ``` 运行以上代码,将会输出以下结果: ``` Doing something... Callback executed! ``` 这里的`CallbackHandler`实现了`Callback`接口,并在回调方法中定义了需要执行的操作。在`Caller`类中调用`doSomething`方法时,将`callbackHandler`对象作为参数传入,然后执行回调方法。 这只是回调函数的一种简单实现方式,实际使用中可以根据具体的场景和需求选择合适的实现方式。希望以上信息对你有所帮助!如果你有任何问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值