2012-05-02 205 views
0

觀察圖案 -
假設觀察到軌道的項目:觀察者模式-受試者保持到由觀察者

  • 出了10個項目的,觀察者僅希望被訂閱3.
  • 對象調用觀察者的功能,讓他知道有 是一些更新。

現在,是否有責任向觀察者發送只有3件物品的更新?

主題可以簡單地告訴觀察者有更新 - 去取10個之中的任何一個嗎?

哪個是正確的出路?有關係嗎?

+0

你是什麼意思的項目?你的'subject'有一些項目,當這些項目改變時通知'觀察者'? –

+0

@lazyberezovsky物品意味着觀察者想要訂閱的東西。 –

回答

0

我寧願去與關於不同事件的具體通知。通常用推模式。像Hey, I just earned some money. Here is actual amount I have earned。而不是Hey, something happened to me.。後者將所有邏輯移動到客戶端(觀察者)。如果您有多個客戶端,客戶端應驗證已更改的內容,並驗證邏輯將被複​​制。其實如果你沒有其他觀察者,你不需要這種模式:)

另外,具體的通知只允許訂閱客戶感興趣的事件。所以,當其他事情發生時觀察者不會感到困擾即當受試者觀看電影時)。

0

現在,是否有責任向觀察者發送關於只有3個項目的更新?

OR

主題可以簡單地告訴觀察員,有更新 - 去取無論你想出來的10?

哪個是正確的出路?有關係嗎?

這裏沒有絕對的正確答案。

這些都是實現選擇,而事實上是在觀察執行部分Design Patterns提到:

1-6。避免觀察者特定的更新協議:推和拉模型。觀察者模式的實現通常會讓主題廣播關於變化的附加信息。主題將此信息作爲參數傳遞給Update。信息量可能差別很大。

在我們稱之爲推模型的一個極端中,主體向觀察者發送關於變化的詳細信息,無論他們是否需要。另一個極端是拉模型;該主題只發送最少量的通知,觀察人員此後明確要求詳細信息。

拉動模式強調主體對觀察者的無知,而推動模式則假設主體知道他們的觀察者的需求。推式模型可能會使觀察者的可重用性降低,因爲Subject類對Observer類進行了假設,而這些假設可能並非總是如此。另一方面,拉模型可能效率低下,因爲觀察者類必須確定沒有來自主題的幫助而改變了什麼。

_7。明確指定感興趣的修改。您可以通過擴展主題的註冊界面來提高更新效率,以允許註冊觀察者僅用於特定感興趣的事件。當發生這種事件時,主體只通知那些對該事件有興趣的觀察員。支持這種方法的一種方法是使用Subject對象的方面概念。爲了註冊對特定事件的興趣,觀察者使用

無效主題::附加(觀察員*,方面&興趣);

其中interest指定感興趣的事件。在通知時,主題將更改的方面作爲更新操作的參數提供給觀察者。例如:

無效觀察員::更新(主題*,看點&利息);

如果它更有意義在你的情況下使用推模式,使個體具有觀察員的需求更多的知識,並用一個方面模型,使觀察者可以註冊在特定部分感興趣主題的數據,去爲它!

我通常喜歡使用拉模型並接受觀察者有一點的主題(這是容易實現)的詳細知識的,但你會建議在您的情況可能是罰款。

1

這是主題保留觀察員列表誰對這個問題感興趣,並通過調用它的更新方法通知這些觀察員。 觀察者看保持的科目,它感興趣的列表。

在此基礎上,當對象被更新,主題將調用更新(..)方法或類似這些觀察員的東西名單。主題可以要麼封裝在一個對象的變化作爲方法的參數,或者通過本課題的這個對象(觀察者通過調用對象的方法本身獲取感興趣的數據)。