2

1つではなく2つ以上のアルゴリズムを連続して使用する戦略パターンの例を誰か教えてもらえますか??

これらのアルゴリズムをリストに挿入してから、このリスト内のすべてのアルゴリズムを実行する必要がありますか?

このリストはコンテキスト クラスのパブリック属性でなければなりませんか?

誰か私に疑似コードの例を作ってもらえますか?

4

3 に答える 3

2

特定の順序ですべてのアルゴリズムを呼び出す戦略を実装できます。私の例は、戦略パターンで説明されているクラスにリンクされています:

class MultiAlgorithm implements Strategy {

    private Strategy[] strategies;

    public MultiAlgorithm(Strategy... strategies) {
        if (strategies == null || strategies.length == 0) {
            throw new IllegalArgumentException(
                    "Algorithms collection cann't be null!");
        }
        this.strategies = strategies;
    }

    @Override
    public int execute(int a, int b) {
        System.out.println("Called MultiAlgorithm's execute()");
        int result = 0;
        for (Strategy strategy : strategies) {
            result += strategy.execute(a, b);
        }
        return result;
    }
}

使用例

public static void main(String[] args) throws Exception {
    Context context = new Context(new MultiAlgorithm(new Add(),
            new Multiply(), new Subtract()));
    int result = context.executeStrategy(1, 2);
    System.out.println(result);
}

ご覧のとおり、新しい「複雑な戦略」のみを実装する必要があります。パターン自体は変わらずそのままでした。

于 2013-01-26T22:51:57.153 に答える
0

順番に実行された戦略の 2 つのインスタンスの複合体である戦略の実装を持つことができますよね?

これが役立つ状況は考えられませんが。

やりたいことは明確ではありません。

** 以下のコメントに基づく **

戦略パターンはここでは適切ではないと思います。なぜなら、あなたは常に決まったことをしており、持っているノイズフィルターのすべての実装を適用しており、戦略パターンは異なるアプローチから選択するためのものだからです。戦略は 1 つだけです。

これを処理パイプラインとして実装します。最初に知っているすべてのアルゴリズムを適用する順序でパイプラインを作成します。run メソッドで、パイプラインを呼び出します。パイプラインは、各アルゴリズムを順番に呼び出します。システムによって新しいイベントが発生し、新しいプロセッサが使用可能になったことを示すため、それをパイプラインに追加します。

編集2

run メソッドを持つオブジェクトがパターンの対象であり、新しいプロセッサが追加されたときに addsubscriber メソッドが呼び出されてプロセッサがリストに追加される場合は、おそらくオブザーバー パターンを使用して実装できます (あまり適していません)。次に、run が呼び出されたときに、サブスクライバーのリストを反復処理し、変更するサウンドを渡します。

しかし、それは私にとってあらゆる種類の間違っていると感じています。

于 2013-01-26T22:27:27.897 に答える
0

あなたの割り当てが取得しようとしているのは、何かを処理するために使用するアプローチを実行時に決定する必要がある外部コード (おそらくコントローラー) があることです。多くの場合、これは Strategy で行われます: ハンドラーはすべて Strategy の実装です (Java では、これはインターフェイスです)。次に、それらをマップに保持し、型のようなものに基づいて適切なハンドラーをディスパッチすることができます。または、それらをリストに保持してループし、適切なものを見つけることができます。

誰もがメッセージを処理できるようにすれば、責任の連鎖ができます。

于 2013-01-26T22:28:32.120 に答える