我曾与某人就战略模式的真正斗争而斗争,我需要专家来解决这个问题.
我们都同意策略模式允许在运行时交换类的内容(例如,行为),同时保持相同的接口.然而,她的论点是"为了[算法]成为一种策略,你必须得到相同的结果".我的论点是,交换"算法"或类的逻辑可能意味着被覆盖的操作的结果是不同的,但它仍然符合策略模式的目的,意图(和分类).
她的代码示例带有注释:
根据您的定义,类的任何子类都是策略.它们具有相同的方法定义(签名),因此可以互换.
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",但它们并非都以不同的方式做"相同"的事情.这是战略的本质.
那么,谁是对的?
你先生是对的,你的同事需要阅读GoF.
"战略模式让算法独立于使用它们的客户."
看到:
http://www.dofactory.com/Patterns/PatternStrategy.aspx
从技术上讲,战略可以做任何他们想做的事.
只有当"外部环境"规定某些固定且可重复的行为无法在程序界面中捕获(称之为"理想属性")时,您需要注意您的策略是真正可替代的L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L这些理想的特性.