java实现callback
回调是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调。“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
当程序运行时,user对象传入doRegister方法,调用execute方法,通过匿名内部类方式实现doCallback方法,调用UserDaoImpl的注册方法实现用户数据的持久化。
总结一下就是,用户方法持有一个回调方法的引用,当调用该用户方法时,会反过去调用回调接口中的回调方法,该方法的具体过程由用户实现。这个过程称为一次回调。