2011-12-09 49 views
1

我正在製作一個網絡應用程序。這裏是問題:如何使用多態性替換if-else塊

我有一個Messenger類。 Messenger有幾個模塊類,分別稱爲ModuleA,B,C等。 信使發送MessagePacks(給其他信使)。每個MessagePack都有一個模塊目的地,一旦到達Messenger,它就會被轉發到正確的模塊(A,B,C等)。

目前爲了轉發到正確的模塊,我使用了一個if-else檢查MessagePack上的標籤來決定在哪裏轉發。

我想要做的是有MessagePack子類而不是使用標籤(標籤是字符串)。所以TypeAmssage消息去ModuleA等。我能想到做的唯一方法是在MessagePack中有一個Messenger的實例和調用像這樣的方法:Messenger.fowardToModuleA(this);但它沒有任何意義(並可能導致問題)在MessagePack上有一個Messenger實例。

任何人都可以想出一種方法來完成我想要的任務,而不使用if-else檢查標記字符串,最好使用MessagePack子類嗎?

+1

看來你探索訪問者模式,是否正確? –

+0

我不熟悉那個,但現在我讀了它。 – Giannis

+0

也許這可以幫助:http://stackoverflow.com/questions/3672091/dispatch-design-pattern –

回答

3

(其他)選項是讓Module決定他們接受哪個MessagePack而哪個不接受。所以,你的Messenger仍然會包含/鏈接到幾個Module類,但只是向前每一個進入MessagePack對所有Modules

for (Module module : modules){ 
    if (module.canHandle(messagePack)){ 
    module.handle(messagePack); 
    //if messagePacks should only be handled by one module, break 
    } 
} 

無論這些模塊的使用字符串標識上messagepack,或只接受某些特定的實現一個messagepack接口取決於你。通過這種方法,你有

  • 一個Messenger類需要,當你在一個信使
  • 模塊應只包含邏輯/知識模塊添加或messagepack類型
  • 一個入口點的所有信息不調整它可以處理的消息包的類型。所以當添加一個新的messagepack時,你只需要調整處理這個的模塊。

不知道這是否與正式名稱正式的設計模式,但是這是我將如何處理這個

+0

+1責任鏈 –

+0

好的謝謝我會看看這將如何與我的應用程序工作! – Giannis

+0

事實證明,這工作得很好!(至少在類圖:P)。我也檢查了Chain of Responsibility模式,但使用List的解決方案更好。乾杯! – Giannis