TemplateMethodパターンでワークチェーンを実装しますか?
-
09-12-2019 - |
質問
worker
クラスの階層を持っています。そのすべては、ワークピースへの何らかの処理を行います。アイデアは、各労働者がいくつかの事前処理を行い、ワークをサブクラスに押し上げてから、後処理を行います。
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);
.
は、階層レベルごとに、追加の新しい方法があるという明らかな欠点がある。
私は、私の管理下にない新しいユーザー実装の労働者でも、すべての前後のメソッドと後処理方法が実行されます。
どうしますか?
解決
テンプレート方式のパターンに続いて、doPreProcessing
メソッドとdoPostProcessing
メソッドがサブクラスでオーバーライドされるようにクラスを設計することでこれを行います。サブクラスがスーパーを呼び出すことを確認できないので、これをしたくないと思います。適用労働者「
継承を使用する代わりに、このようにワーカーオブジェクトを組み合わせたデザインを試すことができます。
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
}
}
. 所属していません StackOverflow