1

我的老師是一個非常好的老師,我傾向於理解他的觀點,但是這個老師只是過了頭。 他解釋了兩種變體的模板方法; - 統一:標準變體,由抽象類和一些抽象方法組成,抽象方法定義了固定算法的變體部分。
- 分離:他自己的變體(我認爲?),其中一個類包含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

回答

1

我從來沒有聽說過模板方法模式的「分離變體」,我同意它看起來與策略非常相似。即使有關於接口所有權的一些推理,或者從客戶的角度來看,我很難發現考慮它們的不同模式是有好處的。

+0

那麼我的老師必須有一個原因來描述他這樣做的原因。我的印象是,我們需要能夠在考試中解釋這一點,我發現它沒有明確的(而不僅僅是微妙的)差異。差異在於它們如何使用?就像,Template Method不會從客戶端調用,而Strategy恰恰是要從客戶端調用,以便他可以更改策略?那有意義嗎? – kTk 2010-01-04 09:56:34

1

在常見的使用,模板方法使用子類,以提供變化的行爲。通過策略,您可以將注入一個算法對象。在您的示例中,模板(分隔)策略之間沒有有用的區別。鑑於Gamma 這本書的年齡,在與其他程序員交談時,引入這個新術語並充分解釋差異可能會造成混淆。避免在課堂外使用它。

模板允許您訪問基類中的受保護成員。策略允許您開發出更多與使用它們的對象耦合的算法,並允許您將相同的算法注入許多不同類型的對象。

+0

你是對的 - 但我問的是模板方法的'分離'變體。我完全同意你關於「統一」的變體,但你如何理解與戰略相比的「分離」? - 在這個變體中沒有受保護的方法或抽象類 – kTk 2010-01-04 09:52:51

+0

我認爲你的老師已經構成了「分離」形式,並沒有什麼區別。如果有差異,那就非常好,我不認爲你需要擔心它。我會相應地更新我的答案。 – 2010-01-04 11:54:39

+0

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

0

模板方法:

  1. 這是它被用來創建一個方法存根,並推遲一些實施的步驟,子類行爲設計模式
  2. 。它由訂單固定的某些步驟組成。
  3. 它定義了執行算法的步驟,它可以提供默認實現,這對所有或某些子類可能是通用的。
  4. 超模板方法從子類調用方法,

策略模式:

  1. 這是一種行爲模式
  2. 它基於代表團
  3. 它改變了對象的膽量通過修改方法行爲
  4. 它用於在算法族之間切換
  5. 它在運行時更改對象的行爲。一種算法將從算法家族中選擇。

基本差異。

  1. 模板方法使用繼承和策略使用組合物
  2. 模板方法由基類實現不應當被重寫。 通過這種方式,算法的結構是由超類控制,並且細節在子類
  3. 戰略封裝的接口背後的算法,它爲我們提供了變化的能力來實現運行時的算法。多種策略爲接口提供了不同的實現。

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