模板設計模式_java程式設計師模板設計模式真的有必要掌握下,冗餘程式碼一掃光
阿新 • • 發佈:2020-12-17
程式汪公司專案實際程式碼中用的最頻繁的設計模式就是模板設計模式了
下面就用具體程式碼例子去演示下模板設計模式的威力和優雅
什麼場景可以用到模板模式
需要固定演算法骨架
各個子類中具有公共部分
需要控制子類擴充套件情況,擴充套件留給子類
<dependency> <groupId>com.google.guavagroupId> <artifactId>guavaartifactId> <version>17.0version>dependency>
程式碼目錄
模板類
內部介面(回撥關鍵)
請求結果基類
客戶端程式碼
import com.google.common.base.Stopwatch;import designpattern.template.exception.BizRuntimeException;importjava.util.concurrent.TimeUnit;
核心模板型別
這裡用到的知識點有
泛型的繼承
介面(入參是介面用於回撥),父類引用指向子類實現
異常
這個模板類就是所謂的骨架
固定的處理邏輯在這裡寫好
子類(就是哪個介面留著擴充套件)
BizHandle這個介面可以根據自己業務具體情況增加或刪除
public class CxwBizTemplate { public RES process(RES result,REQrequest,BizHandlebizHandle) 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() { @Override public void preHandle() { Preconditions.checkNotNull(request, "request引數空"); Preconditions.checkNotNull(request.getName(), "request name引數空"); Preconditions.checkNotNull(request.getRequestId(), "request RequestId引數空"); } @Override public void handle() { //TODO 你的業務程式碼 } @Override public String desc() { return "程式汪查詢功能"; } @Override public void handleException(Throwable e, BaseResult result) { result.setErrorDesc("程式汪查詢異常"); } }); return null; }}
總結
模板類就是寫固定邏輯的地方
注意模板類入參有一個鉤子函式,上面例子就是介面
鉤子函式用於子類實現具體邏輯
使用場景
一般Controller類某功能的增刪改查,程式汪公司用的比較多
rpc業務程式碼,程式汪手機移動端介面就是用的上面的程式碼
其他微服務介面業務程式碼
程式汪往期精彩文章包含答案
程式汪最近整理的BAT大小廠面試題2019(面試題目錄推薦)
目錄:我把精華文章都整理出來了
離職10天,面了4家公司,我的感受...
天真!這簡歷一看就是包裝過的
思考,擼一段 SQL ? 還是寫一段程式碼?
程式汪2019的總結,認識了很多朋友賺了些小錢,現在分享出來
給個[在看],是對程式汪最大的支援