服务端接口设计模式(四)
服务端接口设计模式(一)
服务端接口设计模式(二)
服务端接口设计模式(三)
服务端接口设计模式(四)
1、目前抽象类AbstractBusiService中只是做了参数校验这一项,功能比较单一,可以再多加一些实用功能,比如打印业务接口的执行耗时,可以在doHandle方法添加起始时间,执行结束时间,这样就统计出了执行耗时。代码比较简单,我就不加了。
2、可以在的印象类中加几个空方法,比如before(),after()方法,方便实现类来扩展这2个方法,代码如下:
/**
* 进入doHandle方法时调用
* @param t
*/
protected void before(T t){
}
/**
* 执行结束时调用
* @param t
* @param r
*/
protected void after(T t, R r){
}
@Override
public Result<R> doHandle(RequestMessage requestMessage) {
Result<R> result = Result.errorResult();
T t = null;
try{
t = this.parseParams(requestMessage.getData());
this.before(t);
result = this.passValidator(t);
if(RespCode.SUCCESS.getCode().equals(result.getCode())) {
result = this.handle(t);
}
}catch(Exception e){
e.printStackTrace();
}finally {
this.after(t, result.getData());
}
return result;
}
这里只所以不用抽象方法,是因为实现这2个方法不是必须的,如果部分接口有实际的需要,重写这2个方法即可,对其它代码不影响。如果大家看过ThreadPoolExecutor源码,对这里实现方式应该就不陌生,在runWorker方法中,就执行了2个空方法,分别是beforeExecute和afterExecute,这也是留给子类扩展的,部分摘录代码:
try {
beforeExecute(wt, task);
Throwable thrown = null;
try {
task.run();
} catch (RuntimeException x) {
thrown = x; throw x;
} catch (Error x) {
thrown = x; throw x;
} catch (Throwable x) {
thrown = x; throw new Error(x);
} finally {
afterExecute(task, thrown);
}
} finally {
task = null;
w.completedTasks++;
w.unlock();
}
protected void beforeExecute(Thread t, Runnable r) { }
protected void afterExecute(Runnable r, Throwable t) { }
3、基本上这个实例到此就结束了,但抽象类中还有更多的想象空间。当一个设计框架掌握了程序的入口和出口,它就可以在里面做很多的事情,有很多的发挥空间,譬如,这里的before和after也可以当作一个拦截器来使用,甚至可以在这里增加业务监控,这里有完整的输入和输出参数。这里还有一个优点就是开发的同事可以专注自己的核心业务代码编写,每个接口都可以安排到具体的个人负责,不会导致某个类文件中有非常多的代码,每个开发的人都在上面写自己的代码,导致类文件臃肿不堪,维护的成本相当高。这种接口设计模式就很好的避开了这一点,接口维护相互不影响。(完)
作者原创,转载请注明出处。
完整Demo下载地址:https://gitee.com/gbinb/design-demo