2012-03-14 7 views
3

現在、デザインパターンとその用途について読んでいます。現在のコードを再因子化するために使用するデザインパターンを見つけようとしています。論理に基づいて異なるソースからデータをロードするためのデザインパターンアドバイス

問題:一つの大きなJavaBeanのに特定の順序で複数の異なるソースから

データをロードします。データは、いくつかの単純な初期基準に基づいてロードされます。最初のソースから返されたデータは、次のソースの基準を作成します。

特定のデータソースからデータが返されない可能性があります。これは、JavaBeanへのロード・プロセスを停止しないかもしれませんが、いくつかのロジックに基づいて、ロード・プロセスは、照会するのに十分な基準がないため、特定のデータ・ソースをスキップすることがあります。

現在のソリューション:

BigJavaBean Class 

各Loaderクラスは、それぞれのDAOへ

クエリがBigJavaBean

の属性から構築されている各ソースのDAOにアクセスするためのメソッドが含まれています各ローダークラスには、その "ロードされた"またはそうではない

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

イムつもりですが、インターフェイスがデザインパターンではありません、...インタフェース –

+0

@Jakobボウヤーを言います。 –

+0

私は 'Builderパターン'を 'Factory Pattern'(必要ならば)で束ねることを提案します。 –

答えて

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); 
関連する問題