2016-11-22 60 views
-4

在java觀察者模式中,主題有一個觀察者列表,在觀察者寄存器的主題上填充一次觀察者列表。java:觀察者模式理論問題

假設1000名觀察員已在主題上註冊。主題在主題類中有一個列表。

現在幾天之後,觀察者不再對來自主題的通知感興趣,而是觀察者忘記(或他是懶惰的)註銷。

現在這裏主題包含不必要的浪費內存的列表中不必要的觀察者的對象。

如果內存真的很重要並且不想浪費內存,解決方案是什麼?

解決方案謊言在弱引用?

或者在做註冊的時候,我們做註冊讓我們說10天,之後觀察員必須重新註冊。

+2

_「觀察員忘記(或他是懶惰的)做註銷」 - - 這就是所謂的錯誤。 –

+0

在真實場景中,通常會發生這種情況。我們註冊到YouTube頻道並收到通知。 Youtube提供通知,但我不感興趣。我沒有任何內存問題,youtube不斷給我發送通知。但是如果你在YouTube的一面看到的話,那是一種記憶的浪費。我在電信業務中遇到過這種情況。 – VJS

+0

@VJS所以如果你不感興趣,還有取消註冊選項,爲什麼你不註銷?電腦可以讀取它的記憶,而不是用戶的頭腦。 :)) –

回答

0

你要做的是將一個用例(例如註冊/註銷一個新聞簡報)與一個設計模式(Observer)進行比較。用例基於業務需求,例如如果你不想失去用戶,你不希望從註冊列表中刪除它們。另一方面,如果您的業務需要國家,我們不希望糾纏您的用戶和/或對非活動用戶感到困擾(您從這些新聞簡報中跟蹤他們的點擊率),您可以在一段時間後將其刪除。

用例可以類似於設計模式實現,但具有完全不同的應用程序區域(通常在表示層使用Observer)。它與實際的設計模式無關。

要反映用例和作爲變體的更改,如果它是接口合同的一部分,可以在一段時間後實施清除清單(儘管可以通過通知來完成),但它是一個畢竟,模式

0

如果訂閱者在你的控制之下,那麼你應該修復訂閱者的問題,所以他們會從觀察者中刪除訂閱。

另一方面,如果您的訂閱公開可用,那麼您應該很可能忽略應該註銷的系統。你不能區分應該還是不應該被註冊的系統。

如果在某個時間間隔內支付服務費用,那麼訂閱一些超時會很好。