2012-03-14 53 views
3

我目前在閱讀有關設計模式及其用法。我試圖找到一個設計模式來重新使用我當前的代碼。基於邏輯從不同來源加載數據的設計模式建議

問題:從在一定的順序幾個不同的來源

將數據裝載到一個大的JavaBean。數據是根據一些簡單的初始標準加載的。從第一個源返回的數據將構建下一個源的標準。

可能沒有數據可能從某些數據源返回。這可能不會阻止加載過程進入JavaBean,但基於某些邏輯,加載過程可能會跳過某些數據源,因爲它沒有足夠的條件來查詢。

當前的解決方案:

BigJavaBean Class 

每個裝載類包含的方法來訪問每個源的DAO

查詢到每個DAO的從屬性內置在BigJavaBean

每個加載器類中都有邏輯來確定它的「加載」或不是

LoaderClassDataBase for BigJavaBean 

LoaderClassFlatFiles for BigJavaBean 

LoaderClassXmlFiles for BigJavaBean 

LoaderClassWebService for BigJavaBean 

... and so on 

MainLogicClass 

    BigJavaBean bigJavaBean = new BigJavaBean(); 

    populateBigBeanMethod() { 

    loaderClassDataBase(bigJavaBean); 

    if (loaderClassDataBase.isLoaded()) { 
     loaderClassFlatFiles(bigJavaBean); 

     if (loaderClassFlateFile.isLoaded() { 
      loaderClassXmlFiles(bigJavaBean); 
     } 
    } 

    ... more if statements 


} 

謝謝。

+0

我也會說...接口 – 2012-03-14 15:28:28

+0

@Jakob鮑耶,接口不是設計模式。 – 2012-03-14 15:30:07

+0

我會建議與'Factory Pattern'捆綁的'Builder pattern'(如果需要的話)。 – 2012-03-14 15:32:05

回答

2

這是Chain Of Responsibility pattern

abstract class BigJavaBeanLoader { 
    private final BigJavaBeanLoader successor; 

    public BigJavaBeanLoader() { 
     this.successor = null; 
    } 

    public BigJavaBeanLoader(BigJavaBeanLoader successor) { 
     this.successor = successor; 
    } 

    public void loadData(BigJavaBean bean) { 
     if (this.loadDataFromSource(bean) && this.successor != null) { 
      this.successor.loadData(bean); 
     } 
    } 

    protected abstract boolean loadDataFromSource(BigJavaBean bean); 

    class DataBase extends BigJavaBeanLoader { 
     @Override 
     protected boolean loadDataFromSource(BigJavaBean bean) { 
      // do a database stuff 
      return true; 
     } 
    } 

    class FlatFiles extends BigJavaBeanLoader { 
     @Override 
     protected boolean loadDataFromSource(BigJavaBean bean) { 
      // do flat files stuff 
      return true; 
     } 
    } 

} 

BigJavaBean bigJavaBean = new BigJavaBean(); 
BigJavaBeanLoader loader; 
loader = new BigJavaBeanLoader.FlatFiles(); 
loader = new BigJavaBeanLoader.DataBase(loader); 
loader.loadData(bebigJavaBean); 
1

對我來說,這是一個狀態模式的尖叫(有比這更乾淨的實現,但我沒有足夠的咖啡)。

public abstract class LoaderState { 
    private BigBean bean; 
    public LoaderState(BigBean b) { this.bigBean = b; } 
    public abstract LoaderState getNextLoader(); 
    public abstract void loadData(); 
    class DatabaseLoaderState extends LoaderState { 
    public void loadData() { //do some stuff } 
    public LoaderState getNextLoader() { 
     if (iHadSomeData) return new FlatFileLoaderState(bigBean); 
     return new SomeOtherLoaderState(bigBean); //or return null if nothing else to do 
    } 
    } 

} 

LoaderState state = new LoaderState.DatabaseLoaderState(new BigBean()); 
do { 
    state.loadData(); 
    state = state.getNextLoader(); 
} while (state != null);