`
adamzhao
  • 浏览: 100967 次
  • 性别: 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!

 

分享到:
评论

相关推荐

    java模式--模板模式实例代码

    模板模式是一种行为设计模式,它使你能在代码中定义一个操作的不同步骤,并让子类决定这些...在Java编程中,模板模式广泛应用于各种框架和库中,例如Spring MVC的Controller方法执行流程就是一个典型的模板模式应用。

    UML和模式应用(PDF)

    《UML和模式应用》是一本深入探讨面向对象分析与设计技术的权威著作,适合不同层次的读者,从初学者到经验丰富的专业人士都能从中汲取宝贵的知识。UML(统一建模语言)是软件工程领域中用于系统建模的重要工具,而...

    模板模式Template Pattern

    以示例代码为例,我们可以通过以下几个步骤来理解模板模式的实现过程: 1. **定义抽象模板类(Game)**: 抽象模板类`Game`定义了三个抽象方法`initialize()`、`startPlay()`和`endPlay()`以及一个模板方法`play()`。`...

    模板方法模式案例代码

    下面是一个简单的Java模板方法模式示例,以饮料制作过程为例: ```java public abstract class Drink { public final void prepare() { boilWater(); brew(); pourInCup(); if (isAddCondiments()) { ...

    UML和模式应用.pdf

    本书《UML和模式应用》旨在提供面向对象分析和设计的具体指导。它通过展示销售点终端系统的开发过程,来实际展示面向对象的分析和设计过程,以及如何解决问题。本书特别强调了GRASP(通用职责分配软件模式)这一面向...

    一例读懂设计模式-单例模式、简单工厂模式.zip

    本资源“一例读懂设计模式-单例模式、简单工厂模式.zip”旨在帮助初学者通过实例深入理解这两种重要设计模式:单例模式和简单工厂模式。以下是关于这两个模式的详细讲解。 1. **单例模式**: 单例模式是一种限制类...

    java模板模式

    在Java中,模板模式的应用场景很广泛,例如在框架开发、事件处理、数据库访问等。以一个简单的煮咖啡为例,煮咖啡的过程可以分为几个步骤:磨咖啡豆、冲泡、加糖和奶、搅拌等。这些步骤是固定的,但每个步骤的具体...

    UML和模式应用(第3版)英文版

    《UML和模式应用(第3版)》是软件工程领域一本重要的著作,专注于探讨统一建模语言(Unified Modeling Language,简称UML)以及模式在实际应用中的深度解析。本书的英文版因其准确性和专业性,被广大IT从业者推崇,...

    模板方法模式(jzkangta).rar

    1. "[浪曦原创]JAVA设计模式 第10讲 模板方法模式(jzkangta).exe":这可能是一个教学视频或讲解,详细解释了模板方法模式在Java中的应用和实例。通常,这样的资源会涵盖模式的基本概念、优缺点以及如何在实际项目中...

    后天模板27例

    "后天模板27例"是一个专为后台建站设计的资源集合,旨在提供快速、高效的网站构建解决方案。这个模板库包含了27种不同的设计样式,涵盖了后台管理系统的各种应用场景,如数据分析、用户管理、设置选项等。这些模板...

    UML和模式应用(原书第3版).rar

    《UML和模式应用》是软件工程领域的一本经典著作,尤其在系统分析与设计中具有广泛的应用。这本书的第三版深入浅出地探讨了统一建模语言(Unified Modeling Language,简称UML)以及设计模式在实际项目中的应用。UML...

    Uml和模式应用 配套视频笔记1

    6. **模式应用**:在软件设计中,模式是一种解决常见问题的模板,如工厂模式、观察者模式等。理解和应用设计模式可以提高代码的可读性、可维护性和复用性。在视频笔记中,可能会讲解如何在实际项目中运用这些模式。 ...

    UML和模式应用(第一部分)

    综上所述,"UML和模式应用(第一部分)"的学习资源涵盖了UML的基础知识、系统建模、行为建模、逻辑架构设计和对象设计等方面,为软件开发者提供了全面的建模和设计指导。通过深入学习这些内容,开发者可以提高设计...

    Uml和模式应用-Applying.Uml.And.Patterns(中文版)]

    《Uml和模式应用-Applying.Uml.And.Patterns(中文版)》是面向对象开发领域的一本经典著作,深入探讨了如何在实际项目中有效应用统一建模语言(UML)和设计模式。这本书旨在帮助开发者理解并掌握这两种强大的工具,以...

    【爱生活的程序员-法宗】UML和模式应用(第三版).pdf

    设计模式是一系列针对特定问题的解决方案模板,这些模式已经被广泛验证为有效且可靠的。它们不仅能够帮助解决常见问题,还能提高代码的可读性和可维护性。 #### 设计模式的分类 1. **创建型模式**:关注于对象的...

    UML和模式应用 ppt

    通过这些PPT,你可以深入学习UML的使用以及如何将设计模式应用到实际项目中,提升软件开发的效率和质量。同时,了解GRASP原则、代码实现、可见性控制等概念,能够使你在软件设计和开发中更加得心应手。

    excl-办公类模板1000例

    总结来说,"excl-办公类模板1000例"提供了一个丰富的资源库,涵盖了多种常见的办公应用场景,无论是财务分析还是运营管理,都能找到合适的工具。通过熟练运用这些模板,用户可以提升数据分析能力,提高工作效率,更...

    设计模式_行为型_模板方法模式.md

    模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。 ### 模板方法模式的关键角色 1. **...

    电子表格模板1000例

    《电子表格模板1000例》是一份包含丰富实用模版的资源集合,旨在帮助用户高效管理和分析数据。这份压缩包涵盖了各种场景下的电子表格模版,无论你是数据分析新手还是经验丰富的专业人士,都能从中找到适合自己的工具...

Global site tag (gtag.js) - Google Analytics