`

回调函数

    博客分类:
  • java
阅读更多

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/linxinghui/archive/2009/10/14/4670818.aspx

 

 java回调机制:

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:

同步调用、回调和异步调用。

同步调用是一种阻塞式调用,调用 方要等待对方执行完毕才返回,它是一种单向调用;

回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口 ;(这就需要把把调用者的实例放到被调者的实例中)

异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。---有点像观察者模式

回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

这是搜索的一点比较枯燥的理论解释了,算是红体部分让我稍微明白了一点是怎么个回事,然后又看到一个例子,又让我明白不少。

看看在JAVA里的例子:

public class Test{

   public static void main(String[] args){

     FooBar foo=new FooBar();

/**注意下面的这项代码片段,它给foo对象传递了一个实现ICallBack接口的匿名类,这样FooBar类的对象就取

得了一个实现接口的类,因此FooBar可以在任何时候调用接口中的方法*/

     foo.setCallBack(new ICallBack(){

     public void postExec(){System.out.println("我(postExec)是在Test类中实现的,但我不能被Test的对象引用,"+

     "而由FooBar对象调用 ");}

     });

   }

}

public interface ICallBack(){

  void postExec();

}

public class FooBar..{

  private ICallBack callBack;

  public void setCallBack(ICallBack callBack){

    this.callBack=callBack;

  }

/*我没有实现接口,但是我取得了一个实现接口的对象,而这个对象是其他类调用我的方法( setCallBack ())

时所赋给我的,因此 我可以在业务需要的地方来调用实现接口的类里面的方法*/

  public void doSth(){

     ....

     callBack.postExec();

  }

  ..

}

上述两个类的描述:

  1.class   A,class   B  

  2.class   A实现接口ICallBack  

  3.class   B拥有一个参数为ICallBack接口类型的函数setCallBack(ICallBack   o)  

  4.class   A运行时调用class   B中setCallBack函数,以自身传入参数  

  5.class   B已取得A,就可以随时回调A所实现的ICallBack接口中的方法

下面在来看看在Hibernate中如何构造自己的HibernateTemplate模版

使用模板模式简化DAO操作Hibernate

 

在使用Spring + Hibernate做开发过时,在写DAO的时候使用过Spring的HibernateDaoSupport类,然后在实现的时候就可以很轻松的使用 getHibernateTemplate()方法之后就可以调用save()、delete()、update()等Hibernate的 Session的操作,很简单。比如:
  
  getHibernateTemplate().save(user);

 但是我们在使用Hibernate的时候不一定会使用Spring,所以我们可以模仿Spring的处理方式,做一个Hibernate的模板,使用模板模式来简化我们的开发,其主要的目的就是为了简化开发,使代码达到最大化的重用,另外呢,是帮助自己对回调机制有一个更深层的了解。

1.我们现来实现一个Hibernate模板:
  
  package kick.hibernate;
  
  import net.sf.hibernate.HibernateException;
  import net.sf.hibernate.Session;
  import net.sf.hibernate.Transaction;
  
  public class HibernateTemplate{
  public static Object run(HibernateCallback callback) throws HibernateException{
  Session session = null;
  Transaction tx = null;
  try {
  session = HibernateSessionutil.currentSession();
  tx = session.beginTransaction();
  Object result = callback.execute(session);
  tx.commit();
  session.flush();
  return result;
  } catch (HibernateException e) {
  tx.rollback();
  return null;
  } finally {
  HibernateSessionutil.closeSession();
  }
  }


这里类很简单,就是使用一个实现HibernateCallBack接口的一个回调类,在调用的时候根据具体的需求实现HibernateCallBack类。

强调一下偶,仔细体会红色部分的代码,其实这部分就是对回调的最好的体现,callbak肯定是一个实现了HibernateCallback 接口的类的对象,而execute(Session s)的具体实现就是在这个实现类中实现的,但是我们没法显示的调用该实现类里面的具体方法,如execute(),而只是通过接口的形式来调用方法,晕,说了一大堆,把我自己都快整糊涂了,算了,还是继续写例子吧,结合例子看,可能明白的更快一些。

2.回掉接口HibernateCallBack:
  package kick.hibernate;
  
  import net.sf.hibernate.HibernateException;
  import net.sf.hibernate.Session;
  
  public interface HibernateCallBack {
  Object execute(Session session)throws HibernateException;
  }

好了,到此为止我们就可以使用这个模板了,可以用如下的方式使用:

//调用的时候根据具体的需求实现HibernateCallBack类。 我在这里是实现保存的业务

HibernateTemplate.run(

new HibernateCallback() {
  public Object execute(Session session) throws HibernateException {
  session.save(user);
  return null;
  }
  }   //这其实是一个匿名类

);

不过这还没有达到想Spring里面那样简单,不要着急,“面包会有的”呵呵,我们会达到的。

3.实现我们自己的HibernateSupport类:
  
  从上面的代码可以看出,我们要自己实现HibernateCallback接口,而每次我们实现的时候又重复代码了。因此我们再抽象,讲这些实现放到我们的 HibernateSupport类里面去。看看我们上面的代码就知道我们实现HibernateCallback接口的目的就是为了调用 session.save()方法,即session的方法。代码如下:
  
  package kick.hibernate;
  
  import java.io.Serializable;
  
  import net.sf.hibernate.HibernateException;
  import net.sf.hibernate.Session;
  
  public class HibernateSupport{
  
  public Object save(final Object object) throws HibernateException{
  return HibernateTemplate.run(new HibernateCallBack(){
  
  public Object execute(Session session) throws HibernateException {
  session.save(object);
  return null;
  }
  
  });
  }
  public Object save(final Object object,final Serializable id) throws HibernateException{
  return HibernateTemplate.run(new HibernateCallBack(){
  
  public Object execute() throws HibernateException {
  session.save(object,id);
  return null;
  }
  
  });
  }
  
  public Object saveOrUpdate(final Object object) throws HibernateException{
  return HibernateTemplate.run(new HibernateCallBack(){
  
  public Object execute(Session session) throws HibernateException {
  session.saveOrUpdate(object);
  return null;
  }
  
  });
  }
  ……………………………………………………………………………………
  ……………………………………………………………………………………
  ……………………………………………………………………………………
  
  调用一些其他的session的方法。
  
  }
  
  4.抽象RootDao:
  
  该类为抽象类,在实现自己的DAO类的时候继承该类。该类的有一个HibernateSupport的对象,在子类中使用getHibernateTemplate()方法就可以得到该对象,然后调用它对应的方法。实现代码如下:
  
  package kick.hibernate.dao;
  
  import net.sf.hibernate.Session;
  import kick.hibernate.HibernateTemplateImpl;
  
  public abstract class RootDao {
  private HibernateSupport temp = null;
  
  /**
  * @return Returns the temp.
  */
  public HibernateTemplateImpl getHibernateTemplate(Session session) {
  return new HibernateSupport();
  }
  }
  
  5.使用例子:
  
  定义一个自己的DAO类,实现代码如下:
  
  public class UserDaoImpl extends RootDao implements UserDaoInterface{
  public void saveUser(User user) throws KickException {
  getHibernateTemplate().saveOrUpdate(user);
  }
  ……………………………………………………………………………………
  实现其他的方法
  ……………………………………………………………………………………
  }
  看到没有?红色的代码,就实现了Spring的HibernateSupport了吧

好了,回调暂时这这里就告一段落了......

 

分享到:
评论

相关推荐

    使用C语言写的回调函数

    回调函数在C语言中是一种非常重要的编程机制,它允许我们将一个函数的地址作为参数传递给另一个函数,由这个函数在适当的时候调用我们传入的函数。这种模式在处理异步事件、信号处理、排序算法以及其他需要在特定...

    mfc下实现回调函数

    在Microsoft Foundation Classes (MFC) 中,回调函数是一种特殊类型的函数,它允许用户代码与库或操作系统进行交互,尤其是在处理异步事件时。回调函数通常作为参数传递给其他函数,以便在特定事件发生时调用。在MFC...

    c++builder回调函数例子

    在C++ Builder中,回调函数是一种关键的设计模式,用于在动态链接库(DLL)中调用主程序中的特定函数。回调函数允许DLL与主程序进行通信,传递数据或执行特定操作。 首先,让我们理解什么是回调函数。回调函数是...

    PB 回调函数,多线程

    标题中的“PB 回调函数,多线程”指的是在编程中使用ProtoBuf(Protocol Buffers,简称PB)实现回调函数来处理多线程应用程序。ProtoBuf是Google开发的一种数据序列化协议,常用于结构化数据的存储和交换,它可以...

    delphi Dll的回调函数

    在Delphi编程环境中,DLL的使用尤为常见,尤其是涉及到回调函数时。回调函数允许DLL将控制权返回给调用者,使得调用者能够处理特定的事件或任务。本篇文章将深入探讨Delphi中DLL的回调函数及其应用。 首先,我们...

    C# 实现回调函数

    回调函数在编程中是一种强大的设计模式,特别是在C#这样的面向对象语言中,它允许你在方法执行完毕后调用另一个特定的函数。回调函数通常用于异步编程,事件处理或者作为参数传递,使得代码更加灵活和可扩展。接下来...

    C#回调函数示例

    在编程领域,回调函数是一种非常重要的设计模式,它允许我们将一个方法作为参数传递给另一个方法,在特定条件下由被调用的方法执行。在C#中,回调函数同样被广泛使用,尤其是在异步编程、事件处理和自定义算法中。本...

    java 回调函数 实现

    在Java编程中,回调函数是一种设计模式,它允许一个对象在另一个对象执行特定操作后接收通知或进行处理。这种机制通常用于事件驱动编程或者异步编程中,使得代码能够响应某些特定事件的发生。在给定的场景中,我们...

    Android回调函数的例子

    在编程领域,回调函数是一种设计模式,它允许我们定义一个函数,这个函数可以在另一个函数执行完毕后被调用。在Android开发中,回调函数扮演着至关重要的角色,尤其是在处理异步操作、事件监听以及用户交互时。本...

    Delphi中DLL的回调函数使用

    回调函数是DLL中一个特殊的概念,它允许DLL将控制权交还给调用者,让调用者执行特定的代码。这种机制在处理异步操作、事件处理或自定义数据处理时非常有用。本文将深入探讨Delphi中DLL的回调函数的使用及其相关知识...

    动态库回调函数示例

    本示例"动态库回调函数示例"旨在演示如何在 VC++6.0 下创建和使用 DLL,特别是在 DLL 中定义回调函数。回调函数是一种编程技术,允许 DLL 将控制权交还给调用它的应用程序,以便在特定事件发生时执行自定义操作。 ...

    C语言中的回调函数实例

    在C语言中一般用typedef来为回调函数定义别名(参数名)。 别名通过宏定义typedef来实现,不是简单的宏替换。可以用作同时声明指针型的多个对象。 比如: 代码如下:char *pa,pb;//pa是一个char型指针,但pb是一个...

    osg回调函数的使用

    【osg回调函数的使用】 OpenSceneGraph(OSG)是一个强大的3D图形库,它提供了丰富的功能来构建复杂的三维场景。在OSG中,回调函数是实现用户自定义行为的关键工具,它们允许开发者在特定事件发生时执行特定的代码...

    lwip的回调函数学习笔记与相关函数释疑

    lwip的回调函数学习笔记与相关函数释疑 lwip 是一个轻量级的TCP/IP协议栈,广泛应用于嵌入式系统中。在lwip中,回调函数是一种重要的机制,用于处理网络事件和数据传输。本文将详细介绍lwip的回调函数学习笔记与...

    VC++ DLL 实现回调函数的实例

    回调函数则是编程中一种常见的设计模式,它允许函数将控制权返回给调用者,使得调用者可以在适当的时候执行特定的处理逻辑。在VC++中,将回调函数实现在DLL中,可以提供更加灵活的跨模块通信方式。 首先,我们需要...

    C#回调函数

    在C#编程中,回调函数是一种非常重要的设计模式,它允许我们传递一个方法作为参数到另一个方法中,以便在特定事件发生或者特定条件满足时执行。这种机制使得代码具有高度的灵活性和可扩展性,特别是在处理异步操作、...

    matlab串口收发及回调函数编程

    在串口通信中,我们可以设置一个回调函数来处理接收到的数据。首先定义一个函数,例如: ```matlab function serialCallback(obj, event) data = obj.InputBuffer; % 在这里处理接收到的数据 end ``` 然后,...

    BCB线程中调用主界面的回调函数

    网上的回调函数都是API例子,学习函数指针倒是不错,可是很难让初学者立即应用。常见的情况是辅线程完成某事件后需要“通知”主界面,比如常见的进度条——线程中完成一定的进度后即通知主界面显示到一定的刻度。本...

    回调函数被连续执行两次或多次的原因

    ### 回调函数被连续执行两次或多次的原因 在编程领域,回调函数是一种常见的编程模式,它允许将函数作为参数传递给另一个函数,并在适当的时机由后者调用。这种模式非常有用,尤其是在处理异步操作时。然而,在某些...

    C++回调函数.pdf////C++回调函数.pdfC++回调函数.pdf

    ### C++中的回调函数及其应用 #### 回调函数的概念及定义 回调函数是一种特殊的函数,在C++编程中被广泛使用。回调函数的基本思想是将一个函数作为参数传递给另一个函数,然后在适当的时机调用这个传递进来的函数...

Global site tag (gtag.js) - Google Analytics