程序王公司项目实际代码中最常用的设计模式是模板设计模式。
让我们用具体的代码示例来展示模板设计模式的强大和优雅。
哪些场景可以使用模板模式?
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>17.0</version>
</dependency>
代码目录
import com.google.common.base.Stopwatch;
import designpattern.template.exception.BizRuntimeException;
import java.util.concurrent.TimeUnit;
核心模板类型
这里用到的知识点是
这个模板类就是所谓的骨架
固定的处理逻辑写在这里
子类(即留下哪个接口供扩展)
BizHandle接口可以根据您业务的具体情况进行添加或删除。
public class CxwBizTemplate {
public RES
process(RES result,
REQ request,
BizHandle bizHandle)
Stopwatch stopWatch=Stopwatch.createStarted();
try{
bizHandle.preHandle();
bizHandle.handle();
}catch (BizRuntimeException e){
//把自定义的异常码封装 result
}
catch (Exception e){
bizHandle.handleException(e,result);
System.out.println(e.getMessage());
}finally {
//记录性能日志或统一处理 result
System.out.println(bizHandle.desc()+" 耗时:"
+stopWatch.elapsed(TimeUnit.SECONDS));
}
return null;
}
public interface BizHandle<RES>{
//前置处理
void preHandle();
//具体逻辑
void handle();
//功能描述
String desc();
//异常处理
void handleException(Throwable e,RES result);
}
}
以下是请求对象和返回结果对象,
程序王公司项目一般都会封装一个基类
然后子类继承
一般来说,公司的基类以Base开头命名。
特别注意的是,结果基类一般都会设计有异常代码和异常描述。
请求基类一般都有requestId,用于幂等控制。
class BaseRequest{
private String requestId;
private String name;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
};
//异常码定义在基类
class BaseResult{
private String errorDesc;
private String errorCode;
public String getErrorDesc() {
return errorDesc;
}
public void setErrorDesc(String errorDesc) {
this.errorDesc = errorDesc;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
};
客户端调用代码
import com.google.common.base.Preconditions;
public class CxwCustomer {
public static void main(String[] args) {
CxwCustomer cxwCustomer=new CxwCustomer();
BaseRequest request=new BaseRequest();
cxwCustomer.query(request);
}
public BaseResult query(BaseRequest request){
BaseResult result=new BaseResult();
CxwBizTemplate cxwBizTemplate=new CxwBizTemplate();
cxwBizTemplate.process(result, request,
new CxwBizTemplate.BizHandle() {
public void preHandle() {
Preconditions.checkNotNull(request,
"request参数空");
Preconditions.checkNotNull(request.getName(),
"request name参数空");
Preconditions.checkNotNull(request.getRequestId(),
"request RequestId参数空");
}
public void handle() {
//TODO 你的业务代码
}
public String desc() {
return "程序汪查询功能";
}
public void handleException(Throwable e, BaseResult result) {
result.setErrorDesc("程序汪查询异常");
}
});
return null;
}
}
总结
使用场景
如果您和王程序有深入交流下程序模板下程序模板,可以去知识星球
王程序往年精彩文章有答案
(面试题推荐目录)
给个[在看],是对程序汪最大的支持
预览期间无法单击标签