• 设计模式之模板方法


    模板方法是用得最广泛的设计模式之一,特别是在应用框架中经常用模板方法来实现控制反转(Inversion of Control, IoC)。

    比如在批处理框架中,每个批处理任务都从框架的层面上都可以分成如下三个步骤:

    1. 初始化

    2. 处理

    3. 结束清理

    在EL中,BaseEscrowLedgerApp定义了一个process方法,该方法规定了每个EscrowLedgerApp应用的总体处理流程

    1. init
    2. validateRequest
    3. processInternally
    4. commit
    5. handleResponse

    View Code
     1     public BaseEscrowLedgerResponse process(BaseEscrowLedgerRequest request){
    2 boolean successAction = false;
    3 try {
    4 //init
    5 init(request);
    6
    7 // validate request
    8 validateRequest();
    9
    10 // process request internally
    11 processInternally();
    12
    13 // commit db change
    14 commit();
    15
    16 //build response
    17 buildResponse();
    18
    19 //successAction
    20 successAction = true;
    21 } catch (Exception e) {
    22 handleException(e);
    23 } finally {
    24 // clear up
    25 // clear UOW token
    26 cleanup(successAction);
    27 }
    28 return getResponse();
    29 }

    process方法即为模板方法,而其他的几个方法除commit之外都是抽象方法。每个具体的EscrowLedgerApp应用根据自己的实际情况来实现上述抽象方法。
    commit方法由于对各个子类来说都是提交封装在EmsPaymentBo中的数据变化,所以在BaseEscrowLedgerApp中提供一个默认实现是比较合理的。代码如下。

    View Code
    1     protected void commit() throws CreateException, UpdateException {
    2 EmsPaymentBo payment = getPaymentChanges();
    3 if(payment != null){
    4 EmsPaymentAggregatorBOF.getInstance().executeBulkOperations(payment);
    5 }
    6 }


    以CreateLienApp为例,
    init

    View Code
    1     protected void init(BaseEscrowLedgerRequest request) {
    2 m_request = (CreateLienRequest) request;
    3 m_response = new CreateLienResponse();
    4 m_paymentChanges = new EmsPaymentBo();
    5 m_lienTrx = m_request.getLienTrxInfo();
    6 }

    validateRequest

    View Code
     1     protected void validateRequest() throws EmsValidationException {
    2 m_lienTrx = m_request.getLienTrxInfo();
    3 if(m_lienTrx == null){
    4 throw EmsExceptionHelper.newValidationFailedException("LienTrxInfo", "lienTrxInfo is missing");
    5 }
    6
    7 if (m_lienTrx.getPayerId() <= 0) {
    8 throw EmsExceptionHelper.newValidationFailedException("PayerId", "payerId is missing");
    9 }
    10 if (m_lienTrx.getPayeeId() <= 0) {
    11 throw EmsExceptionHelper.newValidationFailedException("PayeeId", "payeeId is missing");
    12 }
    13
    14 if (m_lienTrx.getExternalOrderId() == null) {
    15 throw EmsExceptionHelper.newValidationFailedException("ExternalOrderId", "external order id is missing");
    16 }
    17
    18 if (m_lienTrx.getExternalContractId() == null) {
    19 throw EmsExceptionHelper.newValidationFailedException("ExternalContractId", "external contract id is missing");
    20 }
    21 if (m_lienTrx.getExternalContractIdType() == null) {
    22 throw EmsExceptionHelper.newValidationFailedException("ExternalContractType", "external contract type is missing");
    23 }
    24
    25 if (m_lienTrx.getLienAmount() == null ) {
    26 throw EmsExceptionHelper.newValidationFailedException("LienAmount", "LienAmount is missing");
    27 } else if ( !m_lienTrx.getLienAmount().isPositive() ) {
    28 throw EmsExceptionHelper.newValidationFailedException("LienAmount", "LienAmount should be positive");
    29 }
    30
    31 }

    processInternally

    View Code
     1     protected void processInternally() throws Exception {
    2 //load emsTrxns
    3 loadEmsTrxns();
    4
    5 //check duplicate
    6 if(checkDuplicate()){
    7 return;
    8 }
    9
    10 //validate lien amount
    11 validateLienAmount();
    12
    13 //create lien
    14 createLien();
    15 }

    5.buildResponse

    View Code
    1     @Override
    2 protected void buildResponse() {
    3 EscrowLienTrx escrowLienTrx = new EscrowLienTrx(m_emsAdjTrx);
    4 m_response.setEscrowLienTrx(escrowLienTrx);
    5 EmsResponseCodeEnum resCode = m_isDuplicatedRequest ? EmsResponseCodeEnum.DUPLICTE_REQUEST_ERROR
    6 : EmsResponseCodeEnum.SUCCESS;
    7 m_response.setResponseCode(resCode);
    8 }







  • 相关阅读:
    使用AD你应该避免的五个错误
    卸载常用组件
    学会批处理,用心学很容易
    VI的用法
    安装Linux版VNC 企业版
    【3】淘宝sdk的下载和安装
    【7】创建一个自己的模板
    【6】网店模板目录及文件介绍
    【11】淘宝sdk的DOM、CSS规范、Widget规范(这个Widget规范差不多就是网页效果)和HTML规范
    【2】认识淘宝sdk模板
  • 原文地址:https://www.cnblogs.com/littlesuccess/p/2285143.html
Copyright © 2020-2023  润新知