策略模式和模版模式的异同

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模式.

就此,问题的"痛处"算是抓住了.

猜你喜欢

转载自lelglin.iteye.com/blog/1561680
今日推荐