写点什么

回调模式

用户头像
Geek_571bdf
关注
发布于: 1 小时前

1. 什么是回调函数?

2. 同步回调与异步回调

3. 回调函数的作用

4. 回调模式的案例

5. 模板模式 vs 回调模式


1. 回调函数的原理

public interface ICallback {  void methodToCallback();}public class BClass {  public void process(ICallback callback) {    //...    callback.methodToCallback();    //...  }}public class AClass {  public static void main(String[] args) {    BClass b = new BClass();    b.process(new ICallback() { //回调对象      @Override      public void methodToCallback() {        System.out.println("Call back me.");      }    });  }}
复制代码

回调模式和模板模式一样,同样能提供:复用+扩展。

 

2. 同步回调与异步回调。

同步调用指的是在函数返回前执行回调函数;异步调用指在函数返回后执行回调函数。

上面的实现就是同步回调,同步回调看起来就像模板模式。还有异步回调,异步回调看起来更像观察者模式。

 

异步回调:异步回调仅仅是注册一个回调函数,当事件发生时,比如发生点击事件,会调用我们注入的回调函数。

// 在 Android 应用开发中,给 Button 控件的点击事件注册监听器Button button = (Button)findViewById(R.id.button);button.setOnClickListener(new OnClickListener() {  @Override  public void onClick(View v) {    System.out.println("I am clicked.");  }});
复制代码

4. 回调模式的应用:

1. JdbcTemplate

Spring 提供了很多 Template 类,比如,JdbcTemplate、RedisTemplate、RestTemplate,虽然叫 Template,但它们都是基于同步回调实现的。

以 JdbcTemplate 为例,传统使用 JDBC 时,我们不仅要写业务相关的 SQL 语句,还有写一堆流程性质的“非业务”代码,比如,加载驱动、创建数据库连接、创建 statement、关闭连接、关闭 statement、处理异常。

而这套流程对于不同的 SQL,是一样的。因此我们可以最好复用它。

JdbcTemplate 替我们封装了这套流程,使用 JdbcTemplate,我们只需要写 SQL 语句、定义查询结果和 POJO 的映射即可。

 

2. addShutdownHook()

hook 其实就是 Callback。JVM 提供了 Runtime.addShutdownHook(Thread hook) 方法,可以注册一个 JVM 关闭的 Hook。当应用程序关闭的时候,JVM 会自动调用 Hook 代码。

可以看到,仅仅是注册一个 Hook(线程),当程序关闭时被调用,因此是异步回调。

 

5. 回调模式与模板模式:

功能一样,但回调基于组合、模板基于继承。“组合优于继承”,因此回调更灵活,这体现在:

①不存在继承的单继承局限;②回调可以创建匿名对象,不需要事先定义类;而模板模式针对不同的实现都要定义不同的子类。③如果某个类中定义了多个模板方法,每个方法都有对应的抽象方法,那即便我们只用到其中的一个模板方法,子类也必须实现所有的抽象方法。而回调只需要往用到的模板方法中注入回调对象即可。

用户头像

Geek_571bdf

关注

还未添加个人签名 2019.06.13 加入

还未添加个人简介

评论

发布
暂无评论
回调模式