1

Gang of Four 总结了Template MethodStrategy的区别如下:

模板方法使用继承来改变算法的一部分。策略使用委托来改变整个算法。

在哪些情况下组合两种设计是合理的,它们的关系会是什么样子?

简单的示例将涉及在模板方法的钩子方法中委托给策略,但是,我想不出这种设计的充分理由。此外,与其委托给子类,不如直接委托给 Strategy。但是,如果没有继承,我们就根本谈不上模板方法。

4

1 回答 1

3

我认为将两种模式结合起来是完全可能的。

当您想在运行时更改某个行为时,您可以使用策略模式,只需更改策略的实例即可。

在此处输入图像描述

即,您可以通过将“策略”分配给不同的具体策略类来更改“上下文”实例的行为。它提供的功能与拥有可以更改的字段并根据该字段的内容执行一系列 if/else 或切换相同的功能。策略模式只是一种更复杂的有条件的方法。与硬编码条件相比,使用该策略的优势在于,您可以通过添加新类来放置更多条件,而无需修改现有类(“SOLID”原则中的“O”)。

另一方面,模板方法定义了一个算法,它有一些“钩子”保持打开状态,必须被具体类覆盖。

在此处输入图像描述

两种模式都从两个不同的角度关注算法:关于在运行时交换算法的能力的策略,以及关于灵活算法结构的模板方法。我不明白为什么你不能将两者结合起来。对我来说,完全有可能将策略定义为模板方法。

于 2017-05-20T09:21:41.233 回答