在战略模式中,我们不能将每个策略作为一个功能而不是作为一个类吗?

时间:2009-06-08 09:36:02

标签: design-patterns

在通常的策略模式中,我们将每个策略作为一个类。我们不能使它成为一个函数,只是在我们实例化一个对象时分配对该函数的引用,并让该对象调用该函数吗?

5 个答案:

答案 0 :(得分:4)

取决于语言。在C#中,您可以将其设为委托。在Java中,它宁愿是一个匿名类。在C ++中,你可以真正使它成为一个函数指针。

答案 1 :(得分:3)

在最简单的情况下,您可以使用函数指针替换策略模式。但是,请考虑这种情况

class HourlyPayStrategy implements PayStrategy
{
    public int calculate()
    {
        int x = doComplexOperation1();
        int y = doComplexOperation2();

        return x + y;
    }

    private int doComplexOperation1()
    {
        // ...
    }

    private int doComplexOperation2()
    {
        // ...
    }
}

如果我们只是提供了一个简单的函数指针,事情开始变得非常毛茸茸,因为你不能重构那个东西(好吧,至少不是以一个很好的封装方式)。

答案 2 :(得分:2)

当然,虽然通过使用对象,您可以利用只有函数无法实现的继承。

答案 3 :(得分:1)

在C#中,您可以使用具有策略模式的委托。看看这个 blog post举个例子。

答案 4 :(得分:1)

大多数C ++实现中发生的事情几乎都是你的建议。编译器通常会解析一个名为Strategy.virtualMethod()的调用(伪代码):

  (Strategy.pVtable[indexOfVirtualMethod])()

因此,如果您唯一关心的是再次引用指针(pVtable),那么如果您无法识别更严重的热点,则应首先进行分析。

我的感觉是,当您使用函数指针而不是策略对象时,您的代码将更难理解和维护。