在看Spring的JdbcTemplate的時候,看到其將模板模式和回調模式結合使用的實現,能夠精妙的解決不少的問題。詳見Spring中涉及的設計模式總結中的關於模板模式和回調模式結合的具分析,本文利用設計思想實現了一個簡單的模板+回調的demo算法
所謂模板板式,就是在父類中定義算法的主要流程,而把一些個性化的步驟延遲到子類中去實現,父類始終控制着整個流程的主動權,子類只是輔助父類實現某些可定製的步驟。
模板方法設計模式適用性:
一、一次性實現一個算法的不變部分,並將可變的算法留給子類來實現。
二、各子類中公共的行爲應該被提取出來並集中一個公共父類中以免代碼重複。 三、能夠控制子類擴展。設計模式
模板模式的相關實現詳見參考文獻ide
上述模板模式存在一個問題,每一個子類都要都要繼承一下上面的父類中的抽象方法,這時,經過CallBack(回調)能夠解決這種問題。 所謂回調,就是方法參數中傳遞一個接口,父類在調用此方法時,必須調用方法中傳遞的接口的實現類。測試
public class AccService { public Object executeAcc(Object req) { // 通用流程 Object result = null; doExecute1(); // 不一樣的實現部分 BaseAccReq accReq = doGenAccReq(req); System.out.println(accReq); // 不一樣的實現部分 result = doInvoke(accReq); return result; } // 默認實現 BaseAccReq doGenAccReq(Object req) { return null; } // 默認實現 Object doInvoke(BaseAccReq req) { return null; } public BaseAccReq execute(AccReqGenCallBack action, Object req) { // before BaseAccReq accReq = action.doGenAccReq(req); // after return accReq; } public Object execute(AccInvokeCallBack action, BaseAccReq req) { // before Object result = action.doInvoke(req); // after return result; } private void doExecute1() { // doSomething } }
public class GeneralAccService extends AccService { @Override BaseAccReq doGenAccReq(Object req) { final Object test = new Object(); return execute(new AccReqGenCallBack() { @Override public BaseAccReq doGenAccReq(Object req) { GeneralAccReq generalAccReq = new GeneralAccReq(); generalAccReq.setOrdNo("1234"); generalAccReq.setPrdNo("01"); System.out.println(test); // doSomething return generalAccReq; } }, req); } @Override Object doInvoke(BaseAccReq req) { return execute(new AccInvokeCallBack() { @Override public Object doInvoke(BaseAccReq req) { GeneralAccReq generalAccReq = (GeneralAccReq) req; System.out.println(generalAccReq); // call Third Service return new Object(); } }, req); } }
public class AdaptAccService extends AccService { @Override BaseAccReq doGenAccReq(Object req) { final Object test = new Object(); return execute(new AccReqGenCallBack() { @Override public BaseAccReq doGenAccReq(Object req) { AdaptAccReq adaptAccReq = new AdaptAccReq(); adaptAccReq.setOrdNo("1234"); adaptAccReq.setChkNo("02"); System.out.println(test); // doSomething return adaptAccReq; } }, req); } @Override Object doInvoke(BaseAccReq req) { return execute(new AccInvokeCallBack() { @Override public Object doInvoke(BaseAccReq req) { AdaptAccReq adaptAccReq = (AdaptAccReq)req; System.out.println(adaptAccReq); //call Third Service return new Object(); } },req); } }
public interface AccReqGenCallBack { BaseAccReq doGenAccReq(Object req); }
public interface AccInvokeCallBack { Object doInvoke(BaseAccReq req); }
public class BaseAccReq { private String ordNo; public String getOrdNo() { return ordNo; } public void setOrdNo(String ordNo) { this.ordNo = ordNo; } }
public class GeneralAccReq extends BaseAccReq { private String prdNo; public String getPrdNo() { return prdNo; } public void setPrdNo(String prdNo) { this.prdNo = prdNo; } }
public class AdaptAccReq extends BaseAccReq { private String chkNo; public String getChkNo() { return chkNo; } public void setChkNo(String chkNo) { this.chkNo = chkNo; } }
public class TestAcc { public static void main(String[] args) { GeneralAccService generalAccService = new GeneralAccService(); Object req = new Object(); Object result = generalAccService.executeAcc(req); System.out.println(result); AdaptAccService adaptAccService = new AdaptAccService(); Object result2 = adaptAccService.executeAcc(req); System.out.println(result2); } }
參考文獻 Spring中的模板模式和回調模式this
回調機制和模板方法.net