运用设计模式设计MIME编码类 -- 兼谈Template Method和Strategy模式的区别
2007-03-16 21:56:45 来源:WEB开发网·Tip 2:图:
可以看到,为了达到“将Aalgorithm从Data分离出来”的目的,代价是Context和Strategy 2 个对象。
·Tip 3:实现和使用。
实例化问题。从图中可以看到,Context和ConcreteStrategy的实例化,都将由“Application工程师”负责。
case语句。“Application工程师”不写case语句了,改“Architecture工程师”要写了。有空研究一下Borland ObjectWindow的源码。
Borland ObjectWindow之Dialog验证用户输入合法性,用了Strategy模式:
·Tip 4:支持变化。Strategy lets the algorithm vary independently from clients that use it。图中的黄色Class就是假想后来扩充的。
·Tip 5:局限性。
Strategy and Context之间是紧耦合。Strategy and Context interact to implement the algorithm. A context may pass all data required by the algorithm to the strategy when the algorithm is called. Alternatively, the context can pass itself as an argument to Strategy operations. That lets the strategy call back on the context as required.
Strategy对Clients不能完全透明。Clients must be aware of different Strategies。 Therefore you should use the Strategy pattern only when the variation in behavior is relevant to clients。想想看,Client要负责ConcreteStrategy(和Context)的实例化,正是决定选哪一个ConcreteStrategy的过程,使得“Strategy对Clients不能完全透明”。
3、Template Method和Strategy模式的对比
对比如下:
· 相同点,都是行为型模式,目的都是方便地改变算法。
· 不同点,实现方式前者使用继承,称为类模式;后者使用委托,称为对象模式。
《设计模式》一书在讲到Template method模式和Strategy模式的关系时说:“模板方法使用继承来改变算法的一部分。Strategy使用委托来改变整个算法。”
“算法的一部分”和“整个算法”的区别,笔者认为“整个算法”是“算法的一部分”的特例(就象数学中全集是集合的特例),因此不是2个模式的根本区别。
“继承”和“委托”的区别,即“类模式”和“对象模式”的区别,笔者认为这是2个模式的根本区别。
顺便说明,《设计模式》一书中非常强调对象模式和类模式的区别,本文就提供了一个很极端的例子——用对象模式可行而用类模式不可行。
更多精彩
赞助商链接