最近我遇到了問題,因爲我的代碼最終需要一個類來存儲另一個類的實例,而另一個類需要存儲第一個類的實例。 我感覺好像這是糟糕的設計,而且我一直試圖想出更好的設計,但是我提出的任何設計顯然都會導致較差的性能。 (需要迭代的列表只是爲了找到某些東西,否則我不需要)有沒有更好的方法讓兩個類互相訪問?
例如,我正在研究一個服務器端系統,我會給你基本概要以便您可以看到我的意思是。
表示Server類包含World和NetworkHandler的實例。
當客戶端連接到服務器時,會通知NetworkHandler並將通道存儲在Session對象中。 登錄後,會創建一個Player實例並添加到World中。
這裏的東西變得奇怪。我嘗試讓Session持有Player的實例,Player則持有Session的實例。這似乎效果最好,但我覺得應該有更好的方法。
至於爲什麼我需要他們從兩個地方訪問,NetworkHandler會傳遞附加到通道的會話,並以這種方式處理數據包。 (這必須能夠訪問連接到會話的玩家)
但是,有時,世界需要遍歷玩家並訪問他們所連接的會話。 (如斷開它們)
謝謝你的任何幫助,如果有什麼不清楚的地方問。
感謝您的回覆。我認爲,如果我不使用像Netty這樣的異步網絡庫,它會不那麼令人困惑。 爲了給你一個我處理網絡的方式背景,我構建了一個基於解碼器的系統。每個會話都有一個解碼器的實例,並且針對不同的狀態有不同的解碼器。 (登錄,播放等)。 我不知道我該如何拆分它,所以現在我會離開這兩個類,並希望我可以考慮更好的設計,因爲我重構了系統的其他部分。 – grundyboy34 2014-10-17 02:02:56
我想我只是想出瞭如何將其設計成更好的系統。如上所述,每個會話可以更改爲不同的解碼器。當解碼器進入處理世界邏輯的WorldDecoder時,我需要Couple Player和Session時遇到的問題。所以我所能做的就是保持一切,但同樣給世界自己的NetworkHandler,並且會話內的會話將被迫使用WorldDecoder。這也將提供託管多個世界的能力,並在需要時使用服務器作爲主要集線器。 – grundyboy34 2014-10-17 02:21:31