0

クラスの階層があり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);

これには、階層レベルごとに追加の新しいメソッドがあるという明らかな欠点があります。

すべての前処理および後処理メソッドが、私の制御下にない新しいユーザー実装ワーカーでも実行されることを保証したいと思います。

どうやってそれをしますか?

4

1 に答える 1

2

doPreProcessingテンプレートメソッドパターンに従って、サブクラスでメソッドとdoPostProcessingメソッドがオーバーライドされるようにクラスを設計することでこれを行います。サブクラスがsuperを呼び出すかどうか確信が持てないため、これを実行したくないと思います。したがって、「新しいユーザーでもすべての前処理メソッドと後処理メソッドが実行されることを保証できません。 -実装された労働者。」

継承を使用する代わりに、次のようにワーカーオブジェクトをチェーンするデザインを試すことができます。

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
    }
}
于 2012-03-08T12:09:49.043 に答える