笔者在写这篇文章前看来一堆关于回调模式的博客,但是都是皮毛不适用于企业级开发。
在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。
定义:所谓的回调,就是程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。
我们先从实战举例:
1.定义一个回调接口:
public interface HandleCallBack {
/** 参数校验 */
public void checkParams();
/** 执行待处理操作,比如模型的创建,修改,删除等 */
public void process();
}
里面定义了需要执行的2个接口方法,参数校验与执行操作。
2.定义一个处理模板类:定义静态方法,可以直接模板调用
public class HandleTemplate {
/** logger */
private static final Logger logger = Logger.getLogger(LoggerNames.TestLogger);
/**
* 执行(调用者要实现回调)[执行器]
* @param result 结果(可以对结果进行处理)
* @param callBack 回调
*/
public static <T> void execute(Object result, HandleCallBack callBack) {
try {
// 1.执行业务参数校验
{
Profiler.enter("执行参数校验")
try {
callBack.checkParams();
} finally {
Profiler.release();
}
}
// 2. 执行业务操作
{
Profiler.enter("执行业务操作");
try {
callBack.process();
} finally {
Profiler.release();
}
}
//业务处理成功
setResultSuccessResultCode(result);
}catch(Exception e){
LoggerUtil.warn(logger, e);
setResult(result, e,true);
}
}
3.直接在需要用的地方直接通过静态调用即可,完成业务处理
HandleTemplate.execute(orderResult, new HandleCallBack() { /** * @see HandleCallBack#checkParams() */ @Override public void checkParams() { { // 这里只判断是否为空,每个字段的校验下 // 沉到通用校验组件里 checkNotNull(testRequest, tsetContext); // 检查产品码是否有效 checkProductValid(testRequest); } } /** * @see HandleCallBack#process() */ @Override public void process() { try { // 获取事务,默认仅有引擎层事务 TransactionTemplateRouter.getTransactionTemplate() .execute(new TransactionCallbackWithoutResult() { /** * @see TransactionCallbackWithoutResult#doInTransactionWithoutResult(TransactionStatus) */ @Override protected void doInTransactionWithoutResult(TransactionStatus status) { execute(testContext); } }); } });
在上述的代码中可以看到, 模板调用了回调, 在里面调用了事务的回调函数。代码显得非常漂亮。