觀察者模式中,消息採用推和拉方式來傳遞的比較

觀察者模式,指的是定義一種對象間的一對多的關係,當一個對象的狀態發生變化的時候,所有依賴於它的對象都將得到通知並更新自己。

 

現在要說的分歧在這裏:

“推”的方式是指,Subject維護一份觀察者的列表,每當有更新發生,Subject會把更新消息主動推送到各個Observer去。

“拉”的方式是指,各個Observer維護各自所關心的Subject列表,自行決定在合適的時間去Subject獲取相應的更新數據。

 

“推”的好處包括:

1、高效。如果沒有更新發生,不會有任何更新消息推送的動作,即每次消息推送都發生在確確實實的更新事件之後,都是有意義的。

2、實時。事件發生後的第一時間即可觸發通知操作。

3、可以由Subject確立通知的時間,可以避開一些繁忙時間。

4、可以表達出不同事件發生的先後順序。

 

“拉”的好處包括:

1、如果觀察者衆多,Subject來維護訂閱者的列表,可能困難,或者臃腫,把訂閱關係解脫到Observer去完成。

2、Observer可以不理會它不關心的變更事件,只需要去獲取自己感興趣的事件即可。

3、Observer可以自行決定獲取更新事件的時間。

4、拉的形式可以讓Subject更好地控制各個Observer每次查詢更新的訪問權限。

 

----------------------------------------------------------------------------------------------------------------------------------

2012-2-27 補充:

事實上“推”和“拉”可以比較的內容太多了,比如:

客戶端通常是不穩定的,服務端是穩定的,如果消息由客戶端主動發起去獲取,它很容易找到服務端的地址,可以比較容易地做到權限控制(集中在服務端一處),服務端也可以比較容易地跟蹤客戶端的位置和狀態,反之則不行;

互聯網頁面的訪問就是一個最好的“拉”的模式的例子;

通常我們希望把壓力分散到各個客戶端上去,服務端只做最核心的事情,只提供內容,不管理分發列表;

……

還有一個idea是關於“推”和“拉”結合的形式,例如,服務端只負責通知某一些數據已經準備好,至於是否需要獲取和什麼時候客戶端來獲取這些數據,完全由客戶端自行確定。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章