文章目录

回调是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调。“If you call me, i will call back”。

Java语言中经常会使用到回调机制,或许只是平时没有注意到吧。比如Android开发中的OnClickListener,当按键触发的时候会执行用户实现的回调方法,从而完成对按键的反馈。再比如在使用SpringJDBC进行数据库操作时候的某些方法,比如JdbcTemplate.update(sql, new PreparedStatementSetter()),这里的PreparedStatementSetter()就是一个回调接口,用户在其内部实现setValues()回调方法执行插入或者更新操作。

本文通过一个简单的例子来对回调的实现及其机理做一个小记录,以备未来查看,也希望给读者一些启发,抛砖引玉。

回调模式其实是设计模式中的观察者模式的一个精简。用户类实现回调接口,将接口的引用传递到一个用户方法中。当调用用户方法的时候,该用户方法将会去调用接口方法的实现,这就是一个回调的基本过程。

如何实现?
首先定义一个回调接口ICallback,该接口内有一个回调方法定义Callback

public interface ICallback<T, E> {
    public T doCallback(E e);
}   

这个回调接口接受两个泛型参数T,E。T为用户指定的返回类型,E为用户传入的参数,在编译时期进行验证和擦除。

接着我们声明用户类,并在类内定义一个方法,传入回调接口

@Service("userServiceImpl")
public class UserServiceImpl implements IUserService {

    @Autowired
    private UserDaoImpl userDaoImpl;
    /**
     * @功能 用户方法,执行回调方法
     * @param ICallback
     * @time 下午12:31:09
     * @return T
     */
    private <T> T execute(ICallback<T, UserDaoImpl> fun) {
        return fun.doCallback(userDaoImpl);
    }

    //用户注册
    @Override
    public boolean doRegister(final User user) {
        return this.execute(new ICallback<Boolean, UserDaoImpl>() {

            @Override
            public Boolean doCallback(UserDaoImpl e) {
                return e.doRegister(user);
            }
        });
    }       
}

这里,我们模拟一个用户注册的场景。用户服务实现类UserServiceImpl的注册方法doRegister(final User user)接受从前台Controller传来的组装好的用户对象,并将该对象通过Spring自动注入的UserDaoImpl用户持久化类的doRegister(user)方法保存到数据库中。

execute(ICallback fun)方法调用回调接口的回调方法doCallback,传入用户持久化类userDaoImpl,返回用户指定的返回值(该返回值在具体的方法中指定)。比如在注册方法doRegister中返回值为Boolean。

当程序运行时,user对象传入doRegister方法,调用execute方法,通过匿名内部类方式实现doCallback方法,调用UserDaoImpl的注册方法实现用户数据的持久化。

总结一下就是,用户方法持有一个回调方法的引用,当调用该用户方法时,会反过去调用回调接口中的回调方法,该方法的具体过程由用户实现。这个过程称为一次回调。

文章目录
Fork me on GitHub