`
adamzhao
  • 浏览: 99250 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

模板模式应用一例

阅读更多

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!

 

分享到:
评论

相关推荐

    UML和模式应用(架构师必备).part02.rar

    UML和模式应用(原书第3版) 原书名: Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition) 原出版社: Prentice Hall PTR 作者: ...

    UML和模式应用(架构师必备).part06.rar

    UML和模式应用(原书第3版) 原书名: Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition) 原出版社: Prentice Hall PTR 作者: ...

    设计模式在Drawcli程序中的应用

    本文是我花三块钱买的,本文首先介绍设计模式产生的背景,然后以简单、易懂且具通用性的Drawcli程序为例,详细分析其中采用的三种设计模式:Prototype、Observer及Chain of Responsibibility 在Drawcli程序中的应用....

    基于设计模式的Java swing交互式界面模式的应用研究与实现

    为例创建了一个界面生成器,该按钮生成器能按照用户输入的属性生成具有该属 性的swingYXL格的按钮,并且生成相应的java代码,用户也可以通过代码来改变这 个按钮。也就是说它具有中间件的功能,能将界面内容保存在...

    UML和模式应用(架构师必备).part01.rar

    UML和模式应用(原书第3版) 原书名: Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition) 原出版社: Prentice Hall PTR 作者: ...

    UML和模式应用(架构师必备).part07.rar

    UML和模式应用(原书第3版) 原书名: Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition) 原出版社: Prentice Hall PTR 作者: ...

    UML和模式应用(架构师必备).part03.rar

    UML和模式应用(原书第3版) 原书名: Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition) 原出版社: Prentice Hall PTR 作者: ...

    UML和模式应用(架构师必备).part04.rar

    UML和模式应用(原书第3版) 原书名: Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition) 原出版社: Prentice Hall PTR 作者: ...

    UML和模式应用(架构师必备).part08.rar

    UML和模式应用(原书第3版) 原书名: Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition) 原出版社: Prentice Hall PTR 作者: ...

    UML和模式应用(架构师必备).part05.rar

    UML和模式应用(原书第3版) 原书名: Applying UML and Patterns : An Introduction to Object-Oriented Analysis and Design and Iterative Development (3rd Edition) 原出版社: Prentice Hall PTR 作者: ...

    论文研究-一种基于模板的数据预取和缓存算法.pdf

    针对专题型应用中普遍存在的大数据查询的频繁性和模式固定性特点,提出一种基于模板的数据预取和缓存算法,用于加快数据查询响应速度并减轻服务器端负载压力。通过构建数据查询模板,在触发器被激发时调用模板以构建...

    二十三种设计模式【PDF版】

    于原著都是以C++为例, 以Java为例的设计模式基本又都以图形应用为例,而我们更关心Java在中间件等服务器方面的应用,因此, 本站所有实例都是非图形应用,并且顺带剖析 Jive论坛系统.同时为降低理解难度,尽量避免使用 ...

    学号_姓名_实验二截图报告(模板)1

    实验二报告单例模式应用场景分析描述飞机大战游戏中哪个应用场景需要用到此模式,目前实验一代码中存在的问题。工厂模式应用场景分析描述飞机大战游戏中哪个应用场景需要用

    PowerPoint-2003-计算机应用基础.pptx

    下面以一个课件封面的制作 为例,讲解一下使用文本占位符输入文字的方法。 本实例完成以后的效果如图。 PowerPoint-2003-计算机应用基础全文共44页,当前为第10页。 在幻灯片中添加文本 PowerPoint-2003-计算机应用...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

Global site tag (gtag.js) - Google Analytics