設計模式應用之Template method模式

husthxd發表於2005-06-06

在專案中應用Template method模式

類圖:

http://blog.itpub.net/get/11/template%20method.jpg


Author:husthxd

From:www.itpub.net

Msn:

模板方法模式達到的效果是公用的實現往父類中移動,特定的操作由子類來完成。應用模板模式可以實現類似如下的需求:

1. 在某個操作前執行某些檢查操作,但各個模組的檢查的操作是不同的

2. 在某個操作前或後執行某些前置後後置的動作,而各個模組的操作是不同的。

3. 等等


示例程式碼如下:

package test.pattern;


import org.apache.log4j.Logger;

import javax.servlet.http.HttpServletRequest;

import java.sql.Connection;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;


/**

* Description : 各模組流程處理基類

* Author : husthxd

* Date: 2005-1-10

* Version 1.0

*/

public abstract class abstractWorkFlowProcessMgr {

static Logger logger = Logger.getLogger(abstractWorkFlowProcessMgr.class);

/**

* 初始化,子類繼承,設定流程id

*/

protected abstract void doInitPocessid();


/**

* 判斷操作是否可以繼續,可以繼續返回true,否則返回false

*

* @param conn

* @param vo

* @param wfo 包含有操作型別,操作結果

* @return

* @throws GFPortalException

*/

protected abstract boolean doCheckCanDoOrNot(Connection conn, Object vo, WorkFlowDataObj wfo) throws GFPortalException;

//模板方法

public void startup(Connection conn, Object vo, WorkFlowDataObj wfo) throws GFPortalException;

{

doInitProcessid();

doCheckCanDoOrNot(conn,vo,wfo);

}

//do other

}


子類:


package test.pattern;


import org.apache.log4j.Logger;

import java.math.BigDecimal;

import java.sql.Connection;

import java.util.Map;


/**

* Description : xx管理流程

* Author : husthxd

* Date: 2005-1-5

* Time: 19:54:29

* Version 1.0

*/

public class DrtPayReqProcessMgr extends abstractWorkFlowProcessMgr {

/**

* 日誌記錄物件

*/

static Logger logger = Logger.getLogger(DrtPayReqProcessMgr.class.getName());


/**

* 工廠方法

*

* @return

*/

public static abstractWorkFlowProcessMgr factory() {

//呼叫工作流API

return new DrtPayReqProcessMgr();

}


/**

* 初始化

*/

protected void doInitPocessid() {

super.processid = WorkFlowDataObj.WF_PROCESS_DRTPAY_REQ;

logger.info("設定流程id成功!");

}


/**

* 判斷操作是否可以繼續,可以繼續返回true,否則返回false

*

* @param conn

* @param vo

* @param wfo 包含有操作型別,操作結果

* @return

* @throws GFPortalException

*/

public boolean doCheckCanDoOrNot(Connection conn, Object vo, WorkFlowDataObj wfo) throws GFPortalException {

logger.info("檢查是否可以執行操作!");

DrtPayReqVO reqvo = (DrtPayReqVO) vo;

//提交操作

if (wfo.getOperation().equalsIgnoreCase(WorkFlowDataObj.OPERATION_SUBMIT)) {

//判斷是否已提交

boolean isSubmit = BusinessCheckSubmitAndAudit.factory().isDrtPayReqSubmit(conn, (DrtPayReqVO) vo);

if (isSubmit) {

//已提交

wfo.setError(CommonUtility.appendErrorFlag("Error!"));

return false;

}

return true;

}

//other method

}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-21822/,如需轉載,請註明出處,否則將追究法律責任。

相關文章