模板模式应用一例

CTO给的设计是这样的:一个管理类DataLoaderManager,一个接口DataLoader,n个DataLoader实现。

我添加了一个对DataLoader的抽象类AbstractDataLoader,抽出实现中普遍用到的方法。

java 代码
  1. public interface DataLoader {   
  2.     /**  
  3.      * load data  
  4.      * @param dataMessage  
  5.      * @return true - if successful  
  6.      * @throws DataLoadException  
  7.      * @see  
  8.      */  
  9.     public boolean loadData(VoDataLoad dataload) throws DataLoadException;   
  10.   
  11. }  

 

java 代码
  1. public abstract class AbstractDataLoader {     
  2.     public void lockDataLoad(VoDataLoad dataload) throws DataLoadException {   
  3.         // implement code   
  4.     }   
  5.   
  6.     public void processErrorDataLoad VoDataLoad dataload) throws DataLoadException {   
  7.         // implement code   
  8.         sendEmailToAdmin(dataload);   
  9.     }   
  10.        
  11.     public void sendEmailToAdmin(VoDataLoad dataload) {   
  12.         // implement code  
  13.     }   
  14. }  

一个实现:

java 代码
  1. public class FxRateLoader extends AbstractDataLoader implements DataLoader {   
  2.   
  3.     public boolean loadData(VoDataLoad dataload) throws DataLoadException {      
  4.         try {   
  5.             // call getFxRateListget() to get a Vo array  
  6.         } catch (Exception e) {   
  7.            // process exception
  8.         }   
  9.         // process other biz
  10.     }   
  11.   
  12.     private VoFXRate[] getFxRateList(VoDataLoad dataload) throws Exception {   
  13.         // code 
  14.     }   
  15. }  

另外个接口实现

java 代码
  1. public class GlobalIndexLoader extends AbstractDataLoader implements DataLoader {      
  2.     public boolean loadData(VoDataLoad dataload) throws DataLoadException {        
  3.         try {   
  4.             // call getIndexList() to get a Vo array   
  5.         } catch (Exception e) {   
  6.             // process exception   
  7.         }   
  8.   
  9.         // process other biz   
  10.     }   
  11.   
  12.     private VoIntIndex[] getIndexList(VoDataLoad dataload) throws Exception {   
  13.         // code   
  14.     }   
  15. }  

不难发现,他们的流程几乎完全一致,可以用模板模式改造一下:

首先改造他们的抽象类AbstractDataLoader,把它的子类的实现流程拿上来,构造流程中的抽象方法,让子类实现。这样的话,第三个,第四个实现就无需重复很多代码了。

java 代码
  1. public abstract class AbstractDataLoader implements DataLoader {   
  2.     private static Logger logger = Logger.getInstance(DataLoaderManager.class.getName());   
  3.     /**  
  4.      * load data, subclass must implement all abstract method  
  5.      * @param dataload  
  6.      * @return true if ok, else false.  
  7.      * @throws DataLoadException  
  8.      */  
  9.     public boolean loadData(VoDataLoad dataload) throws DataLoadException {   
  10.         if (dataload == nullthrow new IllegalArgumentException();   
  11.   
  12.         Object[] voList = null;   
  13.         try {   
  14.             this.getVoList(dataload);   
  15.         } catch (Exception e) {   
  16.             this.processException(dataload, e);   
  17.         }   
  18.   
  19.         if (voList != null) {   
  20.             return this.processVoList(dataload, voList);   
  21.         } else {   
  22.             return false;   
  23.         }   
  24.     }   
  25.     /**  
  26.      * lock dataload if can not update now  
  27.      * @param dataload  
  28.      * @throws DataLoadException  
  29.      */  
  30.     public void lockDataLoad(VoDataLoad dataload) throws DataLoadException {   
  31.         DataLoadBo bo = new DataLoadBo();   
  32.         dataload.setDataStatus(CdaConstants.LOCKED);   
  33.         try {   
  34.             bo.updateStatus(dataload);   
  35.         } catch (AppSystemException e1) {   
  36.             logger.error("error", e1);   
  37.             throw new DataLoadException(e1.getMessage());   
  38.         }   
  39.     }   
  40.     /**  
  41.      * if something wrong, we set dataload status to be E, which means error.  
  42.      * @param dataload  
  43.      * @throws DataLoadException  
  44.      */  
  45.     protected void processErrorDataLoad(VoDataLoad dataload) throws DataLoadException {   
  46.         DataLoadBo bo = new DataLoadBo();   
  47.         dataload.setDataStatus(CdaConstants.ERROR);   
  48.         try {   
  49.             bo.updateStatus(dataload);   
  50.         } catch (AppSystemException e) {   
  51.             throw new DataLoadException(e.getMessage());   
  52.         }   
  53.   
  54.         sendEmailToAdmin(dataload);   
  55.     }   
  56.     /**  
  57.      * get array of VO, such as VoIntIndex, VoFXRate  
  58.      * @param dataload  
  59.      * @return  
  60.      * @throws DataLoadException  
  61.      */  
  62.     protected abstract Object[] getVoList(VoDataLoad dataload) throws DataLoadException;   
  63.     /**  
  64.      * Everything is OK, we process Vo array  
  65.      * @param dataload  
  66.      * @param voList  
  67.      * @return  
  68.      * @throws DataLoadException  
  69.      */  
  70.     protected abstract boolean processVoList(VoDataLoad dataload, Object[] voList) throws DataLoadException;   
  71.     /**  
  72.      * If something is wrong, before set dataload to be Error,   
  73.      * we should try to extract error message and process this exception  
  74.      * @param dataload  
  75.      * @param e  
  76.      * @throws DataLoadException  
  77.      */  
  78.     protected abstract void processException(VoDataLoad dataload, Exception e) throws DataLoadException;   
  79.     /**  
  80.      * send email to notify administrator  
  81.      * @param dataload  
  82.      * @throws DataLoadException  
  83.      */  
  84.     public void sendEmailToAdmin(VoDataLoad dataload) throws DataLoadException{   
  85.         // TODO waiting for Jiang's assign         
  86.     }   
  87. }  

改造第一个接口实现为:

java 代码
  1. public class FxRateLoader extends AbstractDataLoader implements DataLoader {   
  2.   
  3.     protected Object[] getVoList(VoDataLoad dataload) throws DataLoadException {   
  4.         // code   
  5.     }   
  6.        
  7.     protected void processException(VoDataLoad dataload, Exception e) throws DataLoadException {   
  8.         // code   
  9.     }   
  10.        
  11.     protected boolean processVoList(VoDataLoad dataload, Object[] fxRateList) throws DataLoadException {   
  12.         // code   
  13.     }   
  14. }  

哈哈,打完收工。 测试一把,通过,ok!

 

你可能感兴趣的:(设计模式)