我的案例是否使用策略或命令模式?

我有两个我正在执行的算法:

  • AlgorithmA which works with Vector values and
  • AlgorithmB which works with Matrix values

算法有什么共同之处:

  • 这两个都是“summation”算法,它们都是相同的 输入序列。算法在算法上略有不同 对于特定的价值或不是。它们的计算也有所不同 按序列的每个值执行。
  • 两种算法都由相同的对象(例如使用传输或接收算法的' Antenna ')引用。
  • 在这两种情况下,我希望能够序列化Vector或Matrix结果。另外,我应该能够使用从早期的一代计算的(反序列化的)向量/矩阵值来初始化任何算法。

我首先尝试使用战略模式来实现上述目标,但很快我意识到,由于不同的类型/值,战略模式可能并不是最好的。为了使事情进一步复杂化,我的' Antenna '对象可以在任一方向使用任何算法:

class Antenna
{
    private AlgorithmParams _algorithm;
}

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

我认为它重复了“发送”和“接收”的概念多次(因为实现IAlgorithm的 AlgorithmA 本身具有派生类型' AlgorithmATransmit '和'< code> AlgorithmAReceive ',即根据方向在相同的算法内略有变化)。

我还希望在算法逻辑和串行数据之间有一个更清晰的分隔。

我很乐意听到你对此的看法。谢谢 !

0
额外 编辑
意见: 1

1 答案

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

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

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

这是一个简单的示例代码。天线利用对象组合和策略,有一个指向抽象算法的变量,它由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
    }

}
0
额外
非常感谢您的回答!如果我没有弄错,你的建议是不是会限制天线为发送和接收实现相同的算法类型?在我的模型中,天线可以使用算法进行发送,但使用算法B进行发送。谢谢。
额外 作者 alhazen,
嗨alhazen,你如何选择发送和接收?以及它们如何影响算法? AlgoA或AlgoB在实现任一方向时是否有区别?
额外 作者 Son Do Lenh,