2013-05-12 102 views
1

雖然對同一主題有很多問題,但他們都沒有完全清除我的困惑。所以我試圖用兩種模式來舉一個例子和它的解決方案。策略模式與狀態模式之間的區別使用示例

請告訴我,如果我做得正確或我做了什麼錯。

類:

  • BeforeCondition:定義的電壓電平,燃料量,肩帶條件
  • 貝克:其中烘烤餅乾
  • LowSpeedBaker,HighSpeedBaker,MediumSpeedBaker機器:各種Baker的實現或者說狀態。
  • BakerStateFactory:它接受BeforeCondtion並返回其中一個Baker狀態。

實現1

客戶端創建BeforeConditionBakerStateFactory得到適當的麪包師。現在它叫麪包師烘烤()。

實現2

客戶端沒有理會機是如何工作的。它只是將BeforeCondition傳遞給Baker機器。貝克機器本身在BeforeCondition的基礎上決定其狀態。

結論

首先實現讓客戶決定的狀態或具有被注入什麼樣的實現。它不會打擾機器是否可以在這種情況下工作。這是戰略模式。

在第二個實現中,機器自己可以決定其狀態並相應地工作。如果需要的話,它也可以自由地改變流程之間的狀態。這是狀態模式。

+0

我會回答這個問題:我的項目中定義了什麼?如果你不知道,你不能真正決定哪種模式更好。我們爲客戶創建軟件來解決他們的問題,所以我們需要知道問題實際上是什麼:) – 2013-05-12 10:22:38

+0

我不想比較哪種模式更好或套件適合這種情況。但試圖通過它們的實現來理解兩者之間的區別。 – 2013-05-12 10:29:00

+1

所以我認爲你已經很好地回答了你的問題。在你的情況下,策略給予班級用戶更多的控制權,在這種狀態下,你的班級給予更多的自我控制。 – 2013-05-12 10:45:24

回答

1

根據您的例子場景:

您要使用的策略模式,當您使用每烘烤過程中只有一種算法。有很多算法,但是對於每個烘焙過程,只使用其中的一種。在這種情況下,您對貝克的策略可能是CookieProcessPizzaProcess ...烤比薩餅您配置貝克使用PizzaProcess。然後你通過配料烘烤()方法和披薩發送到您的郵箱。與此一起去吧,因爲在這裏考慮退貨類型可能會造成混淆,最終你也會與工廠模式發生衝突。當你配置貝克使用CookieProcess貝克烘烤他們,併發送他們的一半市中心到你的奶奶的郵箱。

所以這裏有兩種不同的策略:

  • 烤在220攝氏度和發送到您的郵箱,在180攝氏度
  • 烘烤,發送給你和你的奶奶

當你想要更詳細地模擬烘烤過程,您將使用狀態模式。在這種情況下,您的狀態可能是BakerOffBakerPreheatingBakerPreheatingDoneBakerHeatingBakerCooldown。當你在星期五開始爲愚蠢的會議準備巧克力餅乾時,貝克處於狀態BakerOff。如你一樣睏倦,你嘗試把餅乾放入,這種情況失敗,只有一個例外說只有不好的糖果店烘烤他們的餅乾沒有預熱。所以你可以調用Baker的enable()方法。內部狀態更改爲貝克認爲並在一段時間後變爲BakerPreheatingDone。在這種狀態轉換中,可能會調用回調,例如,巨大的BakerBell。這提醒你實際上放入餅乾,並開始貝克加熱階段...

所以,我們在這裏烤餅乾只爲奶奶,但在與許多國家的詳細經濟。 請注意,由於您只有一個烘焙算法,因此您只能使用此烘焙餅乾烘焙餅乾Baker

對於高級貝克您可能會合並模式。然後,你可以用同樣的貝克烘烤比薩和餅乾花式預熱的東西!當配置披薩工藝時,當然可以跳過預熱階段。

你最終可以使用不同的策略(比薩,餅乾)的麪包師。他們每個人都使用一些州來完成。然而,戰略決定哪些國家可能會被跳過或交換。 (也許該策略有一個方法isPreheatingForced()

+0

我喜歡你的擴展 – 2013-05-14 00:39:15