设计模式随笔-再论锦囊妙计 (转)
前一段时间,关于我写的《设计模式随笔-锦囊妙计》一文引起了一番争议。一直想写点什么,但实在苦于太忙,今天把它补上。
争议的焦点是"锦囊妙计"是策略模式(《Java与模式》中用完全相同的锦囊妙计的例子来说明策略模式)还是命令模式(我的那篇随笔中写的是命令模式)。以及我在这个问题上是否有抄袭的嫌疑。首先明确表示我的《锦囊妙计》一文是完全自己写的,因为在写的时候我还没有看到《Java与模式》中策略模式一章,更不知道《Java与模式》用这个例子描述策略模式。不过在这里我到是想谈谈我的想法:
设计模式其实就是一种思想,为了学习这些思想,我们要把它寄托于有形的"故事"上面,无非是用故事的思想映射模式的思想而已。那么探讨锦囊妙计是策略模式还是命令模式还是要从模式的思想说起。既然从模式的思想说起,那么我认为《Java与模式》中将锦囊妙计比作策略模式不太合适。
在我的《设计模式随笔-锦囊妙计》一文中是这样将命令模式与锦囊妙计联系在一起的:命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。通过将妙计封装成锦囊妙计,便成为可委派的妙计。由一个对象(ZhuGeLiang)创建并封装,然后传递给另一个对象(ZhaoYun),命令在此没有被立即执行,而是Enqueue了。当条件合适的时候,再将命令解开执行。另外,所有的锦囊妙计都有一个共同的特性,就是可以被执行。所以,赵云不用关心这个锦囊与那个锦囊有什么区别,只需执行便是了。
让我们再看看策略模式:"策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。"、"策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中"退休"的方便,策略模式并不决定在何时使用何种算法。"(以上摘自:《Java与模式》,阎宏 著)既然如此,将三个锦囊妙计看作三个策略我不反对,但应当考虑由谁决定何时使用何种策略。在这里,显然不能让赵云决定何时使用何种策略,否则赵云的代码中就要有一堆IF命令了,这也与"条件外置"的做法相违背(可以参考我的文章《设计模式随笔-让众口不再难调》),何时使用何种策略是诸葛亮的事(《Java与模式》中也正是这样设计的)。这样一来,该例子就与锦囊妙计的真实故事有些出入了。应用了策略模式的锦囊妙计要求由诸葛亮控制策略的更换,而这个更换是不能提前做的,必须在恰当的时候更换成恰当的策略。可那个时候赵云早就过江到东吴了,总不能让诸葛亮用移动电话遥控指挥何时更换策略吧。(呵呵,不知道算不算抬杠,这只能说是纯粹"故事"观点而不是"模式"观点。)
说到这里,还是回到那句话:设计模式其实就是一种思想。有形的"故事"能不能说明无形的思想全在个人理解,不要让"故事"成为学习模式的绊脚石。我是这么理解命令模式与策略模式的,你呢?