我正在使網絡應用程序像分佈式文本編輯器一樣工作。不同的消息在應用程序的模塊或該應用程序的其他客戶端之間發送。 在這一刻,爲了區分消息應該被轉發的地方,我使用了int標籤。在每個名爲canHandle的模塊上調用布爾方法,如果爲true,則將消息轉發給該模塊。改進設計 - 消息傳送
問題是,隨着應用程序越來越大,我越來越多的標籤,我不太喜歡這種解決問題的方式。 您是否可以建議以其他方式識別來自此描述的郵件?
PS的消息僅僅是一個類保持物體和具有某些屬性(其中之一是該標記)
我正在使網絡應用程序像分佈式文本編輯器一樣工作。不同的消息在應用程序的模塊或該應用程序的其他客戶端之間發送。 在這一刻,爲了區分消息應該被轉發的地方,我使用了int標籤。在每個名爲canHandle的模塊上調用布爾方法,如果爲true,則將消息轉發給該模塊。改進設計 - 消息傳送
問題是,隨着應用程序越來越大,我越來越多的標籤,我不太喜歡這種解決問題的方式。 您是否可以建議以其他方式識別來自此描述的郵件?
PS的消息僅僅是一個類保持物體和具有某些屬性(其中之一是該標記)
這裏有一些想法:
嘗試Chain-of-responsibility pattern - 每個模塊是一個單個處理對象。它要麼接受消息併發送它或進一步傳遞。最後一個存根處理對象拋出異常,因爲沒有任何處理程序真正處理該消息。這種做法是非常靈活的,因爲它允許你重新排列處理程序,並在他們每個人實現不同的邏輯
基於內容的路由器企業集成模式 - 集中式郵件組件,它接受一個單一的消息,並根據某些條件將分派到目標目的地之一。規則可以配置,甚至可以在運行時更改。優點是所有的路由都在一個地方處理。缺點 - 路由器必須事先知道每個目的地。
enum
- 也許很老的enum
可以處理路由邏輯?而不是使用int
標籤將它們分組在enum
(這是一個好主意,無論您如何使用它們)併爲每個enum
添加工具getDestinationModule()
?
完全跳過標籤並正確使用面嚮對象的技術。每種消息類型都應該是通用消息的子類型。比你可以使用Visitor
模式,讓每一個消息類型來決定做什麼:
public class MembersList extends Message {/*...*/}
public class NewMember extends Message {/*...*/}
:Is This Use of the "instanceof" Operator Considered Bad Design?
我建議你看看怎麼樣JMS的主題工作,並考慮使用它們,或重新發明輪子並寫出類似的東西。
事件的發佈者不應該關心過濾事件,發佈者應該僅僅發出事件,並且訂閱者應該根據他們是否感興趣/ canHandle()來過濾事件。
canHandle()究竟做了什麼?你在使用地圖嗎? – Adrian
可以處理檢查消息的標記,並且如果其模塊正在使用的其中一個標記返回true。 – Giannis