在通常的策略模式中,我们将每个策略作为一个类。我们不能使它成为一个函数,只是在我们实例化一个对象时分配对该函数的引用,并让该对象调用该函数吗?
答案 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),那么如果您无法识别更严重的热点,则应首先进行分析。
我的感觉是,当您使用函数指针而不是策略对象时,您的代码将更难理解和维护。