2013-03-11 46 views
-1


我有一些python應用程序是聊天服務器。它有多個房間,一個客戶可以連接到一個房間。所以我有班級和班級客戶。客戶端具有諸如on_open(),on_message()和on_close()以及send()函數的事件。收到消息後,我需要將其發送給其他客戶,並將其發佈到我的消息隊列中。這是我的問題。我不知道在哪個班級做什麼。
應該在Room類還是在Client類中發佈到隊列?
我應該在哪裏向其他客戶,客戶類或房間類中廣播消息?
或者我應該將所有事件從客戶端類上傳到Room類?Python類的層次結構和設計問題

回答

1

也許你應該讓隊列管理自己的顧慮,讓它監聽它需要記錄的事件,而不是將它服從於任何其他類。

您可能想要了解觀察者模式(http://code.activestate.com/recipes/131499-observer-pattern/http://philipuren.com/serendipity/index.php?/archives/4-guid.html)。它適用於許多不同類別可能需要響應某些狀態更改的情況(在您的示例中爲傳入消息)。在這種情況下,您的客戶端類將是'主題' - 它會保留一些類似on_open()的類時關心的類的列表,並讓它們知道發生了某些事情;觀察者(在這種情況下,我建議隊列)決定如何處理這些信息。這增強了未來的靈活性,因爲如果您想添加新功能(如創建桌面通知或在消息進入時播放聲音),則無需更改現有類。

此示例使用Observer裝飾者,給你一個想法,你可以贏得多少未來的靈活性,這種策略:http://reader1000.tumblr.com/post/20361533339/observer-pattern-with-python-decorators

0

恕我直言,隊列應該在房間裏,因爲每個客戶端不負責隊列,但爲了讓客戶端看到消息,他們應該能夠看到隊列。

+0

感謝您的回答。但是客戶端不需要查看隊列,因爲隊列是用於歸檔目的並由另一個進程完成的。 – connexion20000 2013-03-11 22:57:56

+0

沒有消息隊列所有其他客戶端如何看到消息? 我唯一的想法是:每次房間發送一條消息都會向每個客戶端發送一條消息,但這看起來很麻煩。 – david 2013-03-11 23:03:07

+0

這就是現在的做法。客戶端可以接收事件並將消息傳遞給房間。 – connexion20000 2013-03-11 23:07:38