在分析ibatis源码解析配置文件时,接触了大量的回调方法,这里写下学习心得。
一般来说,我们都需要定义一个回调接口,该接口的实现由具体的调用者实现,而模版方法里面规范了一个调用的模版。
如下:
回调接口的定义:
/**
* 回调的接口
* @author shuidexiongdi
*
*/
interface ICallBack {
void doCallBack();
}
模版方法的定义:
/**
* 模版类,该类负责回调函数的调用或者不调用
* @author shuidexiongdi
*
*/
class SomeTemplate {
void afterService(ICallBack callBack) {
doSomething();
callBack.doCallBack();
afterDoCallBack();
}
void doSomething() {
System.out.println("haha, i do something first");
}
void afterDoCallBack() {
System.out.println("after doing call back");
}
}
具体的调用者:
/**
* 具体的调用者,该类定义回调的内容(具体回调的内容由该类实现)
* @author dengjianquan-ghq
*
*/
class SomeService {
void serviceOne() {
doMyservice();
SomeTemplate wdbs = new SomeTemplate();
wdbs.afterService(new ICallBack() {
public void doCallBack() {
System.out.println("yes ,doing call back");
}
});
}
void doMyservice() {
System.out.println("do my service");
}
}
测试类:
//测试用的类
public class CallBackTest {
public static void main(String[] args) {
new SomeService().serviceOne();
}
}
打印的结果:
do my service
haha, i do something first
yes ,doing call back
after doing call back
总结一下回调和模版模式的相同点和不同点:
相同点:两者都是定义一个模版,调用者只需要实现指定的接口即可
不同点:回调不要求调用者继承模版类,回调的接口通过参数的方式传入;而模版模式一般都要求调用者实现模板类,回调的接口通过继承的方式获得。