2013-05-28 80 views
6

控制器從用戶接收幾個水果的列表。控制者需要從這些水果中的每一種製作果汁。一個榨汁機可以用橙子和葡萄柚製成果汁;另一個榨汁機知道用蘋果,香蕉和木瓜做果汁;等等。每個榨汁機可以一次接受多個水果,它只會處理其能夠的水果,並忽略其他水果。請提出適合此問題的設計。我一直在考慮下列選項:設計模式選擇難題

  1. 控制器調用MasterJuicer.juice(List<Fruit> fruits)MasterJuicer又調用CitrusJuicer.juice(fruits)PulpyJuicer.juice(fruits)
  2. 責任鏈看起來不正確。榨汁機的調用順序無關緊要。
  3. 工廠?控制器調用JuicerFactory.getJuicers(List<Fruit> fruits)得到List<Juicer>。然後控制器通過每個榨汁機循環並調用Juicer.juice(fruits)。工廠返回實例列表是否很常見?
  4. Map中維護水果與榨汁機的註冊表?控制器爲每個水果調用FruitsRegistry.getJuicer(Fruit fruit),然後循環調用每個Juicer。

回答

2

工廠可以提供正確的榨汁機,但榨汁機的處理邏輯會被推送到您的控制器。

A combinationcompositevisitor模式可能對您有用。

  1. 的複合模式將允許您構建一個MasterJuicer知道該其他榨汁機,可以通過委託給榨汁機啓動「榨汁過程」。這處理你問題的「結構」方面。
  2. 訪客模式允許每個榨汁機都有一個統一的方法來與它們進行交互,而無需調用者(組合MasterJuicer)關心它們如何一起工作。這處理「行爲」方面。

您可以傳遞每個訪問者之間處理的配料列表,以便他們可以與他們所關注的水果進行交互。

如果您不想使用MasterJuicer手動註冊您的榨汁機,那麼您可能希望通過某種服務發現來獲得智能。Java中常見的技術是使用註釋和類路徑掃描在運行時查找類,並在啓動時自動註冊它們。有a few libraries這樣做,或者如果您已經在使用Spring Framework,則可以使用它的built-in scanning tools

+0

非常有吸引力的答案。我將咀嚼這些想法一段時間,看看這些有利於我的真實業務場景。感謝您使用類路徑掃描工具的鏈接! – Somu

2

我覺得第三個選項是最合適的,雖然工廠應負責返回適當的榨汁機的任務 - 因此它不應該返回所有的榨汁機,但你需要的任務之一。地圖可以包含在其中以幫助正確的選擇。

這種情況下,工廠包含邏輯選擇正確的榨汁機,而不是控制器。

+0

正如問題所述,「任務」可能需要多個榨汁機,具體取決於水果清單。在我的#3選項中,我不是說Factory將返回所有的榨汁機。相反,工廠將掃描果實並僅返回處理它們所需的那些榨汁機。 – Somu

+0

啊,對,對不起。然後你寫了一個正確的「實施」。 – ragatskynet

0

我建議你Decorator Pattern

主要的想法是,你有一個基地臺榨汁機和你加它的其他功能。

希望它有幫助!

+0

沒有可以裝飾的BaseJuicer(具有默認或通用功能)。請用代碼擴展您的答案,以便我更好地理解。 – Somu

1

這絕對是一個負責任的鏈條。以某種方式迭代Juicers並創建果汁,直到您沒有水果。有些事情需要考慮的是需要混合果汁(可能是Juice的複合模式),以及如何安排優先順序(如果兩個榨汁機將榨汁葡萄柚,這應該做到這一點?)。將所有這些邏輯封裝在Juicer接口後面。