1

私が実装している 2 つのアルゴリズムがあります。

  • ベクトル値と動作するアルゴリズム
  • マトリックス値で動作するAlgorithmB

アルゴリズムの共通点:

  • どちらも同じ入力シーケンスで提供される「合計」アルゴリズムです。アルゴリズムは、特定の値を考慮するかどうかによって若干異なります。また、シーケンスの値ごとに実行される計算も異なります。
  • 両方のアルゴリズムは、同じオブジェクト (たとえば、Antenna送信または受信にアルゴリズムを使用する ' ') によって参照されます。
  • どちらの場合も、Vector または Matrix の結果をシリアル化できるようにしたいと考えています。さらに、以前の世代から計算された (逆シリアル化された) ベクトル/行列値を使用して、任意のアルゴリズムを初期化できるはずです。

私は最初に Strategy パターンを使用して上記を実装しようとしましたが、すぐに、さまざまな型/値のために戦略パターンが最適ではない可能性があることに気付きました。さらに複雑なことに、私の ' Antenna' オブジェクトはどちらの方向にも任意のアルゴリズムを使用できます。

class Antenna
{
    private AlgorithmParams _algorithm;
}

class AlgorithmParams
{
     private IAlgorithm _transmit;
     private IAlgorithm _receive;
}   

これは、「送信」と「受信」の概念を複数回複製していると感じています(AlgorithmAIAlgorithm を実装する は、それ自体が派生型 ' AlgorithmATransmit' と ' ' を持っているためAlgorithmAReceiveです。つまり、方向に応じて同じアルゴリズム内でわずかに変化します)。

また、アルゴリズム ロジックとシリアル化されたデータをより明確に分離したいと考えています。

これについてご意見をお聞かせいただければ幸いです。ありがとう !

4

1 に答える 1

1

私にとっての戦略パターンは、オブジェクト構成を使用して、さまざまな戦略の束をクラスで使用し、実行時に交換できるようにするだけです。あなたの場合、入力値に基づいて、実行時にアンテナ クラスの動作 (アルゴリズム) を変更する場合は、ストラテジー パターンを使用できます。この場合、Antenna クラスには、AlgoATransmit、AlgoBTransmit、AlgoAReceive、および AlgoBReceive の 4 つのクラスによって派生した AlgorithmInterface を指すインスタンス変数があります。これら 4 つのクラスのそれぞれが、実際のアルゴリズムを定義します。次に、入力値の型をチェックするクライアント クラスが必要で、適切なアルゴリズムを使用するようにアンテナを設定します。

コマンド パターンをどのように適用できるかはわかりませんが、あなたの問題はテンプレート メソッド パターンの良い例である可能性もあり、それを戦略と補完して使用できます。できることは、抽象クラスを持つことです。それをAbstractAlgorithmと呼びましょう。これには、個別の関数を呼び出すことによってアルゴリズムの共通の流れを定義する「テンプレートメソッド」があります。これらの関数は、AlgorithmA、AlgorithmB などのサブクラスでオーバーライドされます。

アンテナの方向は、テンプレート メソッド内の「フック」を使用して解決できます。フックは基本的に、サブクラスでオーバーライドするオプションの関数です。

ここに簡単なサンプルコードがあります。アンテナはオブジェクト構成と戦略を利用し、2 つのアルゴリズムによって導出される抽象アルゴリズムを指す変数を持っています。このように、アルゴリズムの概要を 1 か所で指定でき、各具体的なステップはサブクラスで定義されます。お役に立てば幸いです。問題を正しく理解できたことを願っています。

class Antenna {
    private AbstractAlgorithm algo;
    void SetAlgo(AbstractAlgorithm newAlgo) {
        algo = newAlgo;
    }
}

class AbstractAlgorithm {

    //this is the template method
    void runAlgo() {   
          step1();        //step1 and step2 are two common steps for both algorithms
          step2();
          if (isMatrixValue())
             step3();            //a hook, only AlgoB will override it.
          if (isTransmitting())
             step4();            //a hook, use for transmit
          else if (isReceiving())
             step5();            //a hook, use for receive

    }

    abstract void step1();
    abstract void step2();
    boolean isMatrixValue() {
         return false;         //default value, to not run step3
    }

}

class AlgorithmA {

    void step1() {
         //some implementation
    }
    void step2() {
         //some implementation
    }

    //use the default false value for isMatrixValue(), not to run step3


}


class AlgorithmB {

    void step1() {
         //some implementation
    }
    void step2() {
         //some implementation
    }
    void step3() {
         //some implementation
    }
    boolean isMatrixValue() {
         return true;         //return true and override step3
    }

}
于 2012-05-24T21:07:53.040 に答える