模板方法(分离)和策略模式之间的区别?

问题描述:

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

任何人都可以看到他的观点是什么,以及“分离”变体与战略模式有何不同?
我附上了一张图片,其中包含他书中的两种图案(尚未发布)。

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

+1

您是否有经过您的老师的许可发布网页并公开讨论它们? – kgiannakakis 2010-01-04 09:05:04

+0

在阅读了问题和答案后,我想我同意这听起来像是另一个名字的战略模式。你问过你的老师吗?我有兴趣听到他说的话。 – KarstenF 2010-02-20 22:33:23

我从来没有听说过模板方法模式的“分离变体”,我同意它看起来与策略非常相似。即使有关于接口所有权的一些推理,或者从客户的角度来看,我很难发现考虑它们的不同模式是有好处的。

+0

那么我的老师必须有一个原因来描述他这样做的原因。我的印象是,我们需要能够在考试中解释这一点,我发现它没有明确的(而不仅仅是微妙的)差异。差异在于它们如何使用?就像,Template Method不会从客户端调用,而Strategy恰恰是要从客户端调用,以便他可以更改策略?那有意义吗? – kTk 2010-01-04 09:56:34

+0

我读到了,但这是关于“统一”的模板方法,它与'独立的'模板方法不一样。 – kTk 2010-01-04 09:50:34

在常见的使用,模板方法使用子类,以提供变化的行为。通过策略,您可以将注入一个算法对象。在您的示例中,模板(分隔)策略之间没有有用的区别。鉴于Gamma 这本书的年龄,在与其他程序员交谈时,引入这个新术语并充分解释差异可能会造成混淆。避免在课堂外使用它。

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

+0

你是对的 - 但我问的是模板方法的'分离'变体。我完全同意你关于“统一”的变体,但你如何理解与战略相比的“分离”? - 在这个变体中没有受保护的方法或抽象类 – kTk 2010-01-04 09:52:51

+0

我认为你的老师已经构成了“分离”形式,并没有什么区别。如果有差异,那就非常好,我不认为你需要担心它。我会相应地更新我的答案。 – 2010-01-04 11:54:39

+0

我明白了,谢谢你的回答。 – kTk 2010-01-05 08:43:31

模板方法:

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

策略模式:

  1. 这是一种行为模式
  2. 它基于代表团
  3. 它改变了对象的胆量通过修改方法行为
  4. 它用于在算法族之间切换
  5. 它在运行时更改对象的行为。一种算法将从算法家族中选择。

基本差异。

  1. 模板方法使用继承和策略使用组合物
  2. 模板方法由基类实现不应当被重写。 通过这种方式,算法的结构是由超类控制,并且细节在子类
  3. 战略封装的接口背后的算法,它为我们提供了变化的能力来实现运行时的算法。多种策略为接口提供了不同的实现。

看一看Journaldev Template method,并更好地理解与sourcemaking文章一起Strategy文章。