我与某人就战略模式的真正含义发生了一场极客之争,我需要一位专家来解决这个问题。
我们都同意策略模式允许在运行时交换类的内容(例如行为),同时保持相同的接口。然而,她的论点是“为了使 [算法] 成为一种策略,你必须得到相同的结果”。我的论点是,交换“算法”或类的逻辑可能意味着覆盖操作的结果不同,但它仍然符合策略模式的目的、意图(和分类)。
她带有注释的代码示例:
根据您的定义,一个类的任何子类都是一种策略。它们具有相同的方法定义(签名),因此可以互换。
Interface Strategy
{
DoArithmatic(int[] a)
}
Class A : Strategy
public int DoArithmatic(int[]a)
{
int temp = 0;
for(int i =0; i< a.length; i++)
temp += a[i]
}
Class B : Strategy
public int DoArithmaticB(int[]a)
{
int temp = 0;
for(int i =a.length -1; i>-1; i--)
temp += a[i]
}
Class C : Strategy
public int DoArithmatic(int[]a)
{
int temp = 0;
for(int i =0; i< a.length; i++)
temp -= a;
}
int[] a = { 1,2,3 }
ClassA.DoArithmatic(a) = 6
ClassB.DoArithmatic(a) = 6
ClassC.DoArithmatic(a) = -6//This one is not interchangeable
前两个是策略。因为对于任何输入,他们都会给你完全相同的答案。最后一个不是。仅仅因为它给你一个 int 并不能使它成为一种策略。他们必须“做”同样的事情。
您不能仅仅为了使它们成为一种策略而使用“更高”的抽象术语。
这些都做“数学”,但他们并不是都以不同的方式做“相同”的事情。这就是战略的本质。
那么,谁是对的?