## 一、觀察者模式定義
觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題。這個主題對象在狀態發生變化時,會通知所有的觀察者對象,使他們能夠自動更新自己。
解析:為什么會有觀察者模式?
這里需要注意幾點:
1、**一對多的依賴關系;**并不是說一對一不可用,只是一對一用觀察者模式,沒有必要。
2、**觀察者接收到主題的通知后,自動更新狀態:**觀察者本身都有自己更新自己的方法,需要通知者這個觸發者來觸發,即觀察者在主題達到某個條件后,開始自動更新。
## 二、看類圖,找要點

從類圖中可以看到圖中有四個類:一個抽象通知者,一個具體通知者,一個抽象觀察者,一個具體觀察者。
具體觀察者用來監聽主題變化,注意圖中沒有主題類,有的是通知者,也就是說,主題通過通知者來通知觀察者變化。
**1、觀察者**
一對多的依賴關系就是指主題跟觀察者之間的關系,繼承自Observer的ConcreteObserver可以有多個。
SO,具體觀察者共有的特點就是:Update方法的參數類型相同,返回值相同。只有這樣的觀察者才可以使用觀察者模式。
**2、通知者**
具體通知者ConcreteSubject是通過實現一個接口Subject來實現通知任務的。既然有接口,很明顯,可以有多個通知者,不同的通知者有各自對應的主題。
**3、觀察者模式中的邏輯判斷**——通知者方法(attach:增加觀察者;detach:移除觀察者)
方法中有增加,又有移除,意味這什么?
我們可以在一個主題中通知中,實現多次**邏輯判斷**執行操作。例如:機房收費系統中的上機操作:在插入上機記錄之前,需要通知三個觀察者:卡號是否存在;卡內余額是否充足;查詢卡狀態;好了,接下來的邏輯判斷是:如果前邊三個條件滿足,則通知以下這兩個觀察者:插入上機記錄,修改卡狀態。有了Attach 和Detach 這兩個方法后,我們可以先添加前三個觀察者,執行完后,判斷結果,然后用Detach 方法把之前的觀察者去掉,再Attach 新的觀察者。去執行各自的操作。
## 三、實踐
以機房收費系統為例,簡單列出幾個適合用到觀察者模式的有:上機,下機,充值,注冊,結賬前的統計工作。
用圖形化的語言表示如下:(圖中沒有結賬)

**既然可以有邏輯判斷,觀察者還可以同時調用觀察者自己的多個方法。**
看結賬觀察者:

圖中沒有抽象通知者,我自己給去掉了。為什么有抽象觀察者,是為了降低耦合度才有的,而且像第一種情況那樣,抽象觀察者必須得有,但是結賬這個觀察者模式,我單抽出來,把它的更新方法做成兩個,在系統中,這樣的情況,貌似只有一種,所以我覺得把抽象通知者去掉,反而更簡潔。
PS :這個結賬的主題和觀察者也可以合并到第一種情況中,在這里我只是為了說明
**1、觀察者可以有多個更新自己的方法;**
**2、抽象觀察者,在小的系統中,或者只有一個主題的通知者中可以省去;**
而特意拿出來的。
結語:這些只是個人見解,歡迎指正。
- 前言
- 抽象工廠——創建型設計模式一
- 工廠三姐妹——創建型設計模式之二
- 初識面向對象設計模式
- 建造者模式——創建型模式之三
- 原型模式——創建型設計模式四
- 適配器 and 組合模式——結構性模式之一
- 橋接模式——結構性設計模式之二
- 組合模式——結構型設計模式之三
- 裝飾模式——結構型設計模式之四
- 外觀模式——結構型設計模式之五
- 代理模式——結構型設計模式之六
- 觀察者模式——行為型設計模式之五
- 模板設計——行為設計模式之一
- 命令模式——行為設計模式之二
- 狀態模式——行為型設計模式之三
- 職責模式——行為設計模式之四
- 中介模式——行為模式之六
- 策略+簡單工廠 實戰篇
- 看觀察者怎么全方位觀察機房收費系統
- 登陸也需要裝飾——機房收費系統裝飾模式實戰
- 何為抽象?你有本末倒置嗎?
- 再回首,策略、簡單工廠是否依然?
- 再回首——行為型設計模式