推模式
被觀察者對象向觀察者推送主題的詳細信息, 不管觀察者是否需要, 推送的信息通常是主題對象的全部或部分數據, 一般這種模型的現實中, 會把被觀察者對象中的全部或部分信息通過update的參數傳遞給觀察者 update(Object obj)
拉模式
被觀察者在通知觀察者的時候, 只傳遞少量信息, 如果觀察者需要更具體的信息, 由觀察者主動到被觀察者對象中獲取, 相當於是觀察者從被觀察者中拉數據
一般這種模型的實現中, 會把被觀察者對象自身通過update方法傳遞給觀察者update(Subject subject)這樣在觀察者需要獲取數據的時候, 就可以通過這個引用來獲取了
例子:
推模式
就是會推送信息, 我們就先造出信息類Weather, 用來放溫度和濕度
觀察者抽象類, update時傳送信息Weather物件
推送, 就是向已經註冊在列表中的觀察者, 去進行update並把Weather信息傳過去
觀察者物件被調用update時, 就會依照傳過來的Weather進行反應
這是整體進行的程式碼, 過程中看不到Weather物件, 是因為設置傳送Weather物件都在內部進行
老王和小李則是獲得Weather Station對向作判斷
那我們Weather Station也會發生變化, 就是推送它自己了, 而不是Weather物件
當它改變溫度或濕度的時候, 我們只要調用notifyObserver()
重述一下拉模式重點
首先, 我們的Subject中的notifyObserver就不用傳訊息物件過去
另外我們的Observer類別需要傳Subject實體類過去
兩種模式的對比
推模式
優點: 很好保護了subject 降低觀察者與具體subject的耦合度
缺點: 當變化的參數繁多的時候, 觀察者將收到大量無關信息
拉模式
優點: 變化時對觀察者根據需要去取相應數據
缺點: 觀察者與具體subject的耦合度大大增加
https://www.youtube.com/watch?v=cA-vt0Nf1nQ&list=PLGmd9-PCMLhb16ZxeSy00qUsBazXgJyfM&index=20
https://github.com/iw5420/geroge-design-pattern
沒有留言:
張貼留言