一、觀察者模式定義
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題。這個主題物件在狀態發生變化時,會通知所有的觀察者物件,使他們能夠自動更新自己。
解析:為什麼會有觀察者模式?
這裡需要注意幾點:
1、一對多的依賴關係;並不是說一對一不可用,只是一對一用觀察者模式,沒有必要。
2、觀察者接收到主題的通知後,自動更新狀態:觀察者本身都有自己更新自己的方法,需要通知者這個觸發者來觸發,即觀察者在主題達到某個條件後,開始自動更新。
二、看類圖,找要點
從類圖中可以看到圖中有四個類:乙個抽象通知者,乙個具體通知者,乙個抽象觀察者,乙個具體觀察者。
具體觀察者用來監聽主題變化,注意圖中沒有主題類,有的是通知者,也就是說,主題通過通知者來通知觀察者變化。
1、觀察者
一對多的依賴關係就是指主題跟觀察者之間的關係,繼承自observer的concreteobserver可以有多個。
so,具體觀察者共有的特點就是:update方法的引數型別相同,返回值相同。只有這樣的觀察者才可以使用觀察者模式。
2、通知者
具體通知者concretesubject是通過實現乙個介面subject來實現通知任務的。既然有介面,很明顯,可以有多個通知者,不同的通知者有各自對應的主題。
3、觀察者模式中的邏輯判斷——通知者方法(attach:增加觀察者;detach:移除觀察者)
方法中有增加,又有移除,意味這什麼?
我們可以在乙個主題中通知中,實現多次邏輯判斷執行操作。例如:機房收費系統中的上機操作:在插入上機記錄之前,需要通知三個觀察者:卡號是否存在;卡內餘額是否充足;查詢卡狀態;好了,接下來的邏輯判斷是:如果前邊三個條件滿足,則通知以下這兩個觀察者:插入上機記錄,修改卡狀態。有了attach 和detach 這兩個方法後,我們可以先新增前三個觀察者,執行完後,判斷結果,然後用detach 方法把之前的觀察者去掉,再attach 新的觀察者。去執行各自的操作。
三、實踐
以機房收費系統為例,簡單列出幾個適合用到觀察者模式的有:上機,下機,充值,註冊,結賬前的統計工作。
用圖形化的語言表示如下:(圖中沒有結賬)
既然可以有邏輯判斷,觀察者還可以同時呼叫觀察者自己的多個方法。
看結賬觀察者:
圖中沒有抽象通知者,我自己給去掉了。為什麼有抽象觀察者,是為了降低耦合度才有的,而且像第一種情況那樣,抽象觀察者必須得有,但是結賬這個觀察者模式,我單抽出來,把它的更新方法做成兩個,在系統中,這樣的情況,貌似只有一種,所以我覺得把抽象通知者去掉,反而更簡潔。
ps :這個結賬的主題和觀察者也可以合併到第一種情況中,在這裡我只是為了說明
1、觀察者可以有多個更新自己的方法;
2、抽象觀察者,在小的系統中,或者只有乙個主題的通知者中可以省去;
而特意拿出來的。
Unity全方位觀察物體
最近的專案中遇到了乙個需求 要求能全方位並細緻的觀察物體。一開始我的想法是物體旋轉,然後相機能夠縮放視角,於是立馬著手寫出了以下的 float x float y float xspeed float yspeed private void update else if input.getaxis ...
python觀察者模式 python 觀察者模式
python 觀察者模式 前言e 寫的倉促就不截uml類圖了,書本chapter10,p313能看到圖 一旦觀察的主題有更新,就會通知到觀察者們,下面的例子是最簡單的乙個觀察者範例,假設這是一群投機分子密切關注 軍 火 倉庫的產品與數量變動 class inventory def init self...
觀察者模式
觀察者模式 observer 完美的將觀察者和被觀察的物件分離開。舉個例子,使用者介面可以作為乙個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在介面上。物件導向設計的乙個原則是 系統中的每個類將重點放在某乙個功能上,而不是其他方面。乙個物件只做一件事情,並且將他做...