Strategy模式 的应用场景是:
1. 多个类的分别只是在于行为不同
2. 你需要对行为的算法做很多变动
3. 客户不知道算法要使用的数据
Template Method模式 的应用场景是:
1. 你想将相同的算法放在一个类中,将算法变化的部分放在子类中实现
2. 子类公共的算法应该放在一个公共的类中,避免代码重复
我们知道,设计模式中有这么一个原则: Prefer composition to inheritance.
这句话的背景是OO初期大家都把继承看作是万能的,并过度使用继承来实现多态->可扩展.
理解原则的时候不能脱离它的背景,不然就成盲从了.Template Method模式应该是伴随着OO的出现而萌生的.它是OO中最直观的思考方式的结果.基类留下可变化的空间给子类,由继承类来决定具体行为.听起来是不错,不过...一旦基类的接口发生了变化,每个继承类都得跟着修改才能够继续使用.这就是所谓高耦合与难维护的说法的来源.
Strategy与Template Method模式算是composition与inheritance的典型应用了
GoF的设计模式那本书里有这么一句话:"Template methods use inheritance to vary part of an algorithm. Strategies use delegation to vary the entire algorithm.", 说的正是这个问题.回到具体问题上,
如果我们要封装的算法适合于提供给用户任意使用,是"一整个算法",那么用Strategy模式较好;
如果要封装的变化是一个算法中的部分(换言之,大算法的步骤是固定的),而且我们不希望用户直接使用这些方法,那么应该使用Template Method模式.
就此,问题的"痛处"算是抓住了.