Spring JdbcTemplate模板模式與回調結合分析

在看Spring的JdbcTemplate的時候,看到其將模板模式和回調模式結合使用的實現,能夠精妙的解決不少的問題。詳見Spring中涉及的設計模式總結中的關於模板模式和回調模式結合的具分析,本文利用設計思想實現了一個簡單的模板+回調的demo算法

模板模式

所謂模板板式,就是在父類中定義算法的主要流程,而把一些個性化的步驟延遲到子類中去實現,父類始終控制着整個流程的主動權,子類只是輔助父類實現某些可定製的步驟。
模板方法設計模式適用性:
一、一次性實現一個算法的不變部分,並將可變的算法留給子類來實現。
二、各子類中公共的行爲應該被提取出來並集中一個公共父類中以免代碼重複。 三、能夠控制子類擴展。設計模式

模板模式的繼承方式實現

模板模式的相關實現詳見參考文獻ide

模板模式結合回調方式實現

上述模板模式存在一個問題,每一個子類都要都要繼承一下上面的父類中的抽象方法,這時,經過CallBack(回調)能夠解決這種問題。 所謂回調,就是方法參數中傳遞一個接口,父類在調用此方法時,必須調用方法中傳遞的接口的實現類。測試

Demo實現

公共操做類

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
    }
}

具體操做類1

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);
    }
}

具體操做類2

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);
    }
}

回調接口定義1

public interface AccReqGenCallBack {
    BaseAccReq doGenAccReq(Object req);
}

回調接口定義2

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

Spring中涉及的設計模式總結設計

相關文章
相關標籤/搜索