【问题标题】:Difference between Template Method (separation) and Strategy pattern?模板方法(分离)和策略模式之间的区别?
【发布时间】:2010-01-04 09:00:49
【问题描述】:

我的老师是一位非常好的老师,我倾向于理解他的观点,但这一点让我无法理解。 他用两种变体解释了模板方法;
- 统一:标准变体,由一个抽象类和一些抽象方法组成,这些抽象方法定义了其他固定算法的变体部分。
- 分离:他自己的变体(我认为?),其中一个类包含 templateMethod() 并使用对接口的委托来改变算法的各个部分,这在我看来与策略模式完全一样。

谁能明白他的观点是什么,以及“分离”变体与策略模式有何不同?
我附上了一张图片,其中包含他书中的两种模式(尚未出版)。

http://img64.imageshack.us/img64/3620/strategytemplate.jpg

【问题讨论】:

  • 您是否获得了老师的许可来发布这些页面并公开讨论它们?
  • 阅读了问题和答案后,我想我同意这听起来像是另一个名称的策略模式。你问过你的老师吗?我很想听听他说什么。

标签: design-patterns strategy-pattern template-method-pattern


【解决方案1】:

我从未听说过模板方法模式的“分离变体”,我同意它看起来与策略极其相似。即使有一些关于接口所有权或如何从客户角度调用它们的推理,我也很难发现将它们视为不同的模式有任何好处。

【讨论】:

  • 嗯,我的老师这样描述它一定是有原因的。我的印象是我们需要能够在考试中解释这一点,我觉得很奇怪,没有明显的(不仅仅是细微的)区别。区别可能在于它们的使用方式吗?就像,模板方法永远不会从客户端调用,而策略正是要从客户端调用,以便他可以更改策略?这有意义吗?
【解决方案2】:

在常见的用法中,模板方法使用子类来提供不同的行为。使用 Strategy,您可以注入一个算法对象。在您的示例中,模板(分离)策略之间没有有用的区别。鉴于 Gamma et al 书的年代,介绍这个没有充分解释差异的新术语很可能在您与其他程序员交谈时引起混淆。避免在课程之外使用它。

模板允许您访问基类中的受保护成员。策略允许您开发与使用它们的对象更松散耦合的算法,并允许您将相同的算法注入到许多不同类型的对象中。

【讨论】:

  • 你是对的 - 但我要问的是模板方法的“分离”变体。我完全同意你对“统一”变体的看法,但与战略相比,你如何理解“分离”变体? - 此变体中没有受保护的方法或抽象类
  • 我觉得你们老师已经编好了“分离”的形式,没有区别。如果有区别,那很好,我认为您不必担心。我会相应地更新我的答案。
【解决方案3】:

模板方法:

  1. 这是一种行为设计模式
  2. 它用于创建方法存根并将一些实现步骤推迟到子类。它由顺序固定的某些步骤组成。
  3. 它定义了执行算法的步骤,并且可以提供可能对所有或部分子类通用的默认实现。
  4. 超类模板方法从子类调用方法,

策略模式:

  1. 这是一种行为模式
  2. 它基于委托
  3. 它通过修改方法行为来改变对象的内部结构
  4. 用于在算法族之间切换
  5. 它在运行时改变对象的行为。将从一系列算法中选择一种算法。

基本区别。

  1. 模板方法使用继承,策略使用组合
  2. 不应重写基类实现的模板方法这样,算法的结构由超类控制细节在子类中实现
  3. 策略 将算法封装在一个接口后面,这使我们能够在运行时更改算法。多种策略为接口提供不同的实现。

查看 Journaldev Template methodStrategy 文章以更好地理解 sourcemaking 文章。

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2010-11-02
    • 2013-08-09
    • 2013-01-18
    • 2010-11-16
    相关资源
    最近更新 更多