1

我有两种正在实现的算法:

  • 量值
  • 使用矩阵值的算法B

算法的共同点:

  • 两者都是提供相同输入序列的“求和”算法。算法在是否考虑特定值方面略有不同。它们在每个序列值要执行的计算方面也有所不同。
  • 两种算法都被同一个对象引用(例如Antenna,使用算法进行传输或接收的“ ”)。
  • 在这两种情况下,我都希望能够序列化 Vector 或 Matrix 结果。此外,我应该能够使用从较早一代计算的(反序列化的)向量/矩阵值来初始化任何算法。

我首先尝试使用策略模式来实现上述内容,但很快我意识到策略模式可能不是最好的,因为类型/值不同。更复杂的是,我的 ' Antenna' 对象可以在任一方向使用任何算法:

class Antenna
{
    private AlgorithmParams _algorithm;
}

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

我觉得它多次重复了“发送”和“接收”的概念(因为AlgorithmA实现了 IAlgorithm 的 ' AlgorithmATransmit' 和 ' AlgorithmAReceive' 本身具有派生类型,即在同一算法中根据方向略有不同)。

我还希望算法逻辑和序列化数据之间有一个更清晰的分离。

我很高兴听到您对此的意见。谢谢 !

4

1 回答 1

1

对我来说,策略模式只不过是使用对象组合来允许在一个类中使用一堆不同的策略并在运行时互换。在您的情况下,如果您希望 Antenna 类根据输入值在运行时更改其行为(算法),则可以使用策略模式。如果是这种情况,在 Antenna 类中,您有一个指向 AlgorithmInterface 的实例变量,它由 4 个类派生:AlgoATransmit、AlgoBTransmit、AlgoAReceive 和 AlgoBReceive。这 4 个类中的每一个都将定义真正的算​​法。然后,您需要一个客户端类来检查输入值类型,并将天线设置为使用适当的算法。

虽然我看不到如何应用命令模式,但您的问题可能也是模板方法模式的一个很好的案例,您可以将它与策略一起使用。你可以做的是有一个抽象类,我们称之为 AbstractAlgorithm,它有一个“模板方法”,通过调用单独的函数来定义算法的公共流程。这些函数将在子类中被覆盖,例如 AlgorithmA、AlgorithmB。

天线的方向可以通过使用模板方法中的“钩子”来解决。钩子基本上是在子类中可选覆盖的函数。

这是一个简单的示例代码。Antenna利用Object Composition and Strategy,有一个变量指向抽象算法,由2个算法派生而来。这样,算法的大纲可以在一个地方指定,每个具体步骤都在子类中定义。希望它有所帮助,我希望我能正确理解您的问题。

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 回答