我与某人就战略模式的真正目标进行了极客,我需要专家来解决这个问题。
我们都同意策略模式允许在运行时交换类的内容(例如,行为),同时保持相同的接口。然而,她的论点是“为了[算法]成为一种策略,你必须得到相同的结果”。我的论点是,交换“算法”或类的逻辑可能意味着被覆盖的操作的结果是不同的,但它仍然符合策略模式的目的,意图(和分类)。
她的代码示例带注释:
根据您的定义,类的任何子类都是策略。它们具有相同的方法定义(签名),因此可以互换。
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并不是一个策略。他们必须“做”同样的事情。
你不能仅仅使用“更高”的抽象术语来使它们成为一种策略。
这些都是“MATH”,但它们并非都以不同的方式做“相同”的事情。这是战略的本质。
那么,谁是对的?
答案 0 :(得分:11)
你先生是对的,你的同事需要阅读GoF。
“策略模式允许算法独立于使用它们的客户端。”
请参阅:
答案 1 :(得分:6)
从技术上讲,策略可以做任何他们想做的事。
只有当“外部环境”指示某些固定且可重复的行为无法在程序界面中捕获(称之为“理想属性”)时,您需要注意您的策略是真正可替代的L la Liskov关于这些理想的特性。
答案 2 :(得分:4)
我支持你的意见。只要可以在相同的环境中使用,不同的策略可以做很多不同的事情。
例如,如果要访问树中的每个节点,则有效策略可以是:
所有策略都会以不同的顺序访问节点,但目标(访问每个节点)将是相同的。因此,如果订单无关紧要,任何一种策略都可以满足您的需求。
答案 3 :(得分:3)
FWIW,Wikipedia article同意你并且从未听说过她的立场。
答案 4 :(得分:3)
前两个是策略。因为任何输入他们会给你完全相同的答案。最后一个不是。只是因为它给你一个int不会使它成为一种策略。他们必须“做”同样的事情。
他们必须做同样的事情,但这并不意味着他们给出完全相同的结果。来自GoF的激励示例是不同的布局算法或不同的寄存器分配算法之一。策略具有相同的目标 - 在页面上布置文本和图像块,或将虚拟寄存器分配给硬件寄存器 - 但它们不必创建完全相同的结果。
因此,如果您示例中Strategy
的目标是使用输入执行任何算术,则每个示例都是该目标的策略。如果目标是对传递的数组求和,则DoArithmatic
将被称为CalculateSum
,最后的示例将无法符合策略的合同,因此违反了LSP 。
答案 5 :(得分:2)
根据“头部设计模式”(see here)第24页
“策略模式定义了一系列算法,
封装每一个,并使它们可以互换
策略允许算法独立于
使用它的客户。 “
所以先生你是对的,至少根据定义模式的人来说,但是他们知道什么。
答案 6 :(得分:2)
你是。策略的重点是替代算法。它们是否提供相同的结果是所需行为的副产品。
答案 7 :(得分:2)
我认为,说策略是否必须具有确定性相同的问题更为正确,这超出了战略模式定义的范围。
如果函数总是返回给定输入的相同结果,则它是确定性的。如果两个函数是确定性的并且它们总是为相同的输入返回相同的值,那么它们在确定性上是等价的。它们可能有也可能没有相同的副作用;如果他们这样做,那么他们只是等同。
通常情况并非如此。让我们考虑一个似乎需要确定性等价的例子:排序。您可能认为如果两个比较器实现无法为相同的输入返回相同的结果,那么它们中的至少一个必须是错误的,但不一定是这种情况。
排序顺序因国家/地区而异。有些地方对口音不敏感。有些人把McDuck和MacDuck放在一起,等等。这些都是策略,这是战略模式的完美应用,而且策略肯定不是不是确定性等价。
你赢了。
答案 8 :(得分:0)
我也必须同意。一个很好的例子是定价计算器策略。根据项目数量,客户类型,运输目的地等几个变量,您可以采用不同的策略来计算发票的最终金额。这些策略中的每一个都肯定会返回不同的结果并且仍然会被考虑战略模式。