2012-01-22 60 views
0

我正在使網絡應用程序像分佈式文本編輯器一樣工作。不同的消息在應用程序的模塊或該應用程序的其他客戶端之間發送。 在這一刻,爲了區分消息應該被轉發的地方,我使用了int標籤。在每個名爲canHandle的模塊上調用布爾方法,如果爲true,則將消息轉發給該模塊。改進設計 - 消息傳送

問題是,隨着應用程序越來越大,我越來越多的標籤,我不太喜歡這種解決問題的方式。 您是否可以建議以其他方式識別來自此描述的郵件?

PS的消息僅僅是一個類保持物體和具有某些屬性(其中之一是該標記)

+0

canHandle()究竟做了什麼?你在使用地圖嗎? – Adrian

+0

可以處理檢查消息的標記,並且如果其模塊正在使用的其中一個標記返回true。 – Giannis

回答

0

這裏有一些想法:

  1. 嘗試Chain-of-responsibility pattern - 每個模塊是一個單個處理對象。它要麼接受消息併發送它或進一步傳遞。最後一個存根處理對象拋出異常,因爲沒有任何處理程序真正處理該消息。這種做法是非常靈活的,因爲它允許你重新排列處理程序,並在他們每個人實現不同的邏輯

  2. 基於內容的路由器企業集成模式 - 集中式郵件組件,它接受一個單一的消息,並根據某些條件將分派到目標目的地之一。規則可以配置,甚至可以在運行時更改。優點是所有的路由都在一個地方處理。缺點 - 路由器必須事先知道每個目的地。

  3. enum - 也許很老的enum可以處理路由邏輯?而不是使用int標籤將它們分組在enum(這是一個好主意,無論您如何使用它們)併爲每個enum添加工具getDestinationModule()

  4. 完全跳過標籤並正確使用面嚮對象的技術。每種消息類型都應該是通用消息的子類型。比你可以使用Visitor模式,讓每一個消息類型來決定做什麼:

    示例性訪客在Java中的
    public class MembersList extends Message {/*...*/} 
    public class NewMember extends Message {/*...*/} 
    

    Is This Use of the "instanceof" Operator Considered Bad Design?

+0

是的,我已經在使用這種技術。我的問題是如何區分每個消息的功能而不使用標籤。例如,當它傳遞一個成員列表標籤爲1時,當它傳遞一個新成員標籤的名稱是2等(因此,接收器模塊知道如何處理此消息)。沒有標籤可以做到這一點嗎? – Giannis

+0

我試着想我怎麼可以使用枚舉。謝謝 – Giannis

+0

@latusaki:看看解決方案4,根本不使用標籤。 –

0

我建議你看看怎麼樣JMS的主題工作,並考慮使用它們,或重新發明輪子並寫出類似的東西。
事件的發佈者不應該關心過濾事件,發佈者應該僅僅發出事件,並且訂閱者應該根據他們是否感興趣/ canHandle()來過濾事件。

另請參閱Publish/Subscribe pattern