一起使用模板方法和策略

Using Template Method and Strategy together

四人帮总结了模板方法策略的区别如下:

Template methods use inheritance to vary part of an algorithm. Strategies use delegation to vary the entire algorithm.

在哪些情况下组合 两种设计是合理的,它们之间的关系如何?

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

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

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

也就是说,您可以通过将 "strategy" 分配给不同的具体策略 class 来更改 "Context" 实例的行为。它提供的功能与拥有一个可以更改的字段和执行 if/elses 链或基于该字段内容的切换相同。策略模式只是一种更复杂的条件处理方式。使用该策略优于硬编码条件的优势在于,您可以通过添加新的 classes 来放置更多条件,而无需修改现有条件("SOLID" 原则中的 "O") .

另一方面,模板方法定义了一种算法,其中有一些 "hooks" 未解决,必须被具体的 class 覆盖。

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

我同意 Danilo 的观点,尽管我的解释有点不同。

我目前正在尝试构建一个 WordFinder 生成器程序,我想提供如何在网格中放置单词的不同实现(例如,通过回溯找到所有解决方案或使用最终会找到解决方案的乐观随机方法) . 对于这些实现,我认为策略模式就是其中之一。

此外,我希望算法的实现更加灵活。有些部分可能是通用的(清除网格),而其他部分可以以不同的方式实现(当解决方案有效时,跳过无法放置的单词......)。 一般策略的这些变体(伪代码):

public final CreateBoard() {
    ClearBoard();
    FindSolution(); --override
    FillGaps();
}

我认为这可以通过模板模式来完美实现。使用此方法不会重复清除和填充板的空白,并且该策略仅限于实现不同版本的 FindSolution 方法。

希望对您有所帮助。