Template method 和Strategy 在绝大多数情况向都可以完成相同的任务,即以某种步骤完成任务而又不依赖于具体步骤的实现。Template method 降具体步骤的实现留给了子类而Strategy则将具体实现留给任何遵循摸一特定接口的类。绝大多数的framework都可以找到两者中至少一个。
两者间的区别在于Template method使用继承来达到目的。而继承是一种强耦合,它使子类依赖于父类。其弊病在子类的代码也需要复用时体现出来。详细的例子在Uncle Bob的Agile Software Development中有:对于大多数排序算法而言,swap,outOfOrder都是必需的操作,因此他们不因成为某算法的子类。而Strategy则提供更松的耦合,其swap,outOfOrder也可以被很多不同算法使用。
“被很多不同算法使用”,正是这一点决定着是否使用Strategy,即当你的具体步骤的实现不是只会被起父类使用而是有其他类也需要使用时,it's time for Strategy。
其实这两者的区别就是继承和组合的区别。
现实中的例子可以是Web framework中的controller机制。绝大多数都是Strategy,有一个总控的servlet,负责解析url和分发request到下一级controller(例如Struts 中的Action或Spring的Controller),这些下一级controller就是Strategy,由用户具体实现。如果仅是如此,Template method一样可以胜任,继承那个总控的Servlet就是了(就像Oscar一样),毕竟,这些子类往往不会被其他的代码使用。然而,如果需要Preprocessor和Postprocessor的话就一定要用Strategy了,这些processor往往用来处理一些公用的东西,很多的controller都会用到。仍然使用template method会造成code duplication。