Java 回调函数透彻理解

  计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码引用。这一设计允许了底层代码调用在高层定义的子程序

        在Java里面,我们使用接口来实现回调。

        这篇文章中的解说定义非常好:http://blog.csdn.net/sweetwxh/article/details/2067139

        所谓的回调,就是程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。下面是例子。

      1.  首先定义一个类Caller,按照上面的定义就是程序员A写的程序a,这个类里面保存一个接口引用。

      

[java]  view plain  copy
 
  1. public class Caller {  
  2.     private MyCallInterface callInterface;  
  3.       
  4.     public Caller() {  
  5.     }  
  6.       
  7.     public void setCallFunc(MyCallInterface callInterface) {  
  8.         this.callInterface = callInterface;  
  9.     }  
  10.       
  11.     public void call() {  
  12.         callInterface.printName();  
  13.     }  
  14. }  


       2.  当然需要接口的定义,为了方便程序员B根据我的定义编写程序实现接口。

  

[java]  view plain  copy
 
  1. public interface MyCallInterface {  
  2.     public void  printName();  
  3. }  


      3.  第三是定义程序员B写的程序b

[java]  view plain  copy
 
  1. public class Client implements MyCallInterface {  
  2.   
  3.     @Override  
  4.     public void printName() {  
  5.         System.out.println("This is the client printName method");  
  6.     }  
  7. }  


       4.  测试如下

[java]  view plain  copy
 
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Caller caller = new Caller();  
  4.         caller.setCallFunc(new Client());  
  5.         caller.call();  
  6.     }  
  7. }  


      看到这里应该明白什么是回调了,有些文章介绍的很好,但是刚开始没看明白,是因为把第3步的类省略,直接写成匿名类了。

        5.  在测试方法中直接使用匿名类,省去第3步。

[java]  view plain  copy
 
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         Caller caller = new Caller();  
  4. //      caller.setCallFunc(new Client());  
  5.         caller.setCallFunc(new MyCallInterface() {  
  6.             public void printName() {  
  7.                 System.out.println("This is the client printName method");  
  8.             }  
  9.         });  
  10.         caller.call();  
  11.     }  
  12. }  



    -------------------------------------Spring中的回调例子-------------------------------------
    Spring中的回调例子:

    模板方法(Template Method)在Spring中的应用

    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
    Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入JdbcTemplate的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这可能是Template Method不需要继承的另一种实现方式吧。 

    以下是一个具体的例子: 
    JdbcTemplate中的execute方法 


    JdbcTemplate执行execute方法 


以下是一个具体的例子: 
JdbcTemplate中的execute方法 


JdbcTemplate执行execute方法 

猜你喜欢

转载自blog.csdn.net/wuyangyang555/article/details/80827788
今日推荐