2012-03-08 7 views
0

私はworkerクラスの階層を持っています。これらのクラスはすべて、ある種の処理をワークに対して行っています。アイデアは、各労働者がいくつかの前処理を行うこと、であるサブクラスにワークをプッシュして、いくつかの後処理を行います。templatemethodパターンでワークチェーンを実装しますか?

public void process(Workpiece wp) { 
    doPreprocessing(wp); 
    sub.process(wp); // this obviously doesn't work 
    doPostProcessing(wp); 
} 

は今、私は新しい抽象メソッドを宣言することでこれを解決しています:

public final void process(Workpiece wp) { 
    doPreprocessing(wp); 
    subProcess(wp); // this obviously doesn't work 
    doPostProcessing(wp); 
} 

protected abstract void subProcess(Workpiece wp); 

は、各階層レベルに対して追加の新しい方法があるという明らかな欠点を有する。

私の管理下にない新しいユーザー実装の作業者であっても、すべての処理前と処理後のメソッドが実行されることを保証したいと思います。

どうすればよいですか?

+0

私の現在のソリューションの問題点は何ですか? – amit

+0

ワーカーチェーンは非常に長く、4人のフレームワークワーカーで、その下に任意の数のユーザー定義ワーカーがあります。ですから、私はプロセス、サブプロセス、サブプロセス、サブサブプロセスを持っています...私はそれが単純でエレガントな解決策ではないと思います。 – Jonathan

答えて

2

テンプレートメソッドのパターンに従って、doPreProcessingdoPostProcessingのメソッドがサブクラスでオーバーライドされるようにクラスを設計することでこれを行います。サブクラスがスーパークラスを呼び出すことができないため、これを行うことができないため、 "すべてのプリプロセスメソッドとポストプロセスメソッドが新しいユーザーでも実行されることは保証できません」と述べた。

public abstract class Worker { 
    private Worker next; 

    protected Worker(Worker next) { 
     this.next = next; 
    } 

    public void process(Workpiece wp) { 
     preProcess(wp); 

     if (next != null) 
      next.process(wp); 

     postProcess(wp); 
    } 

    public abstract void preProcess(Workpiece wp); 
    public abstract void postProcess(Workpiece wp); 
} 

あなたのクラスを、そして、代わりに「次」労働者を拡張するユーザー実装クラス、作成します。代わりに、継承を使用しての

、あなたはこのように、チェーンの労働者が一緒にオブジェクトのデザインを試みることができます

public class MyWorker extends Worker { 

    public MyWorker() { 
     super(new MyOtherWorker()); 
    } 

    public abstract void preProcess(Workpiece wp) { 
     // code 
    } 

    public abstract void postProcess(Workpiece wp) { 
     // code 
    } 
} 
+0

私はプロセスを最終的にするつもりですが、あなたは私のヒーローです! – Jonathan

関連する問題