【问题标题】:Do I use the Strategy or Command pattern for my case?我对我的案例使用策略模式还是命令模式?
【发布时间】:2012-05-31 05:48:49
【问题描述】:

我正在实施两种算法:

  • AlgorithmA 适用于 Vector 值和
  • AlgorithmB,适用于 Matrix 值

算法的共同点:

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

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

class Antenna
{
    private AlgorithmParams _algorithm;
}

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

我觉得它多次重复了“发送”和“接收”的概念(因为实现 IAlgorithm 的 AlgorithmA 本身具有派生类型 'AlgorithmATransmit' 和 'AlgorithmAReceive' 即内部的细微变化相同的算法取决于方向)。

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

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

【问题讨论】:

    标签: c# design-patterns strategy-pattern command-pattern


    【解决方案1】:

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

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

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

    这是一个简单的示例代码。 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
        }
    
    }
    

    【讨论】:

    • 非常感谢您的回答!如果我没记错的话,你的建议不会限制天线为发射和接收实现相同的算法类型吗?在我的模型中,天线可以使用 AlgorithmA 进行发送,但使用 AlgorithmB 进行接收。谢谢。
    • 嗨,alhazen,您如何在发送和接收之间进行选择?它们如何影响算法?在实现任一方向时,AlgoA 或 AlgoB 有什么区别吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2011-07-27
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多