天天看點

[設計模式筆記]三. 行為型模式--21. Observer模式(觀察者)對象行為型模式(一)一. 意圖二. 适用性三. 模式結構四. 角色說明五. 說明六. 我的了解

行為型模式--Observer模式(觀察者)對象行為型模式

一. 意圖

         定義對象間的一種一對多的依賴關系, 當一個對象的狀态發生改變時, 所有依賴于它的對象都得到通知并被自動更新. 這一模式中的關鍵對象是目标(subject)和觀察者(observer). 一個目标可以有任意數目的依賴它的觀察者. 一旦目标的狀态發生改變, 所有的觀察者都得到通知. 作為對這個通知的響應, 每個觀察者都将查詢目标以使其狀态與目标的狀态同步.

Web中的MVC, MFC中的文檔視圖都是這個模式.

二. 适用性

        當一個抽象模型有兩個方面, 其中一個方面依賴于另一方面. 将這二者封裝在獨立的對象中以使它們可以各自獨立地改變和複用。

        當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變.

        當一個對象必須通知其它對象, 而它又不能假定其它對象是誰. 換言之, 你不希望這些對象是緊密耦合的.

三. 模式結構

[設計模式筆記]三. 行為型模式--21. Observer模式(觀察者)對象行為型模式(一)一. 意圖二. 适用性三. 模式結構四. 角色說明五. 說明六. 我的了解

圖1 

四. 角色說明

Subject(目标)

—目标知道它的觀察者. 可以有任意多個觀察者觀察同一個目标.

—提供注冊和删除觀察者對象的接口.

Observer(觀察者)

—為那些在目标發生改變時需獲得通知的對象定義一個更新接口.

ConcreteSubject(具體目标)

—将有關狀态存入各ConcreteObserver對象.

—當它的狀态發生改變時, 向它的各個觀察者發出通知.

ConcreteObserver(具體觀察者)

—維護一個指向ConcreteSubject對象的引用.

—存儲有關狀态,這些狀态應與目标的狀态保持一緻.

—實作Observer的更新接口以使自身狀态與目标的狀态保持一緻.

互動

[設計模式筆記]三. 行為型模式--21. Observer模式(觀察者)對象行為型模式(一)一. 意圖二. 适用性三. 模式結構四. 角色說明五. 說明六. 我的了解

圖2

1:SetState()觸發2:Notify()調用, 但是1:SetState()并不是一定由Observer來調用的. 但在視圖文檔結構中, 使用者通常通過視圖來改變文檔的狀态, 而視圖就是Observer.

五. 說明

1. Observer模式允許你獨立的改變目标和觀察者. 你可以單獨複用目标對象而無需同時複用其觀察者, 反之亦然. 它也使你可以在不改動目标和其他的觀察者的前提下增加觀察者.

2. 目标和觀察者間的抽象耦合, 目标不知道任何一個觀察者屬于哪一個具體的類. 這樣目标和觀察者之間的耦合是抽象的和最小的.

3. 支援廣播通信. 不像通常的請求, 目标發送的通知不需指定它的接收者. 目标對象并不關心到底有多少對象對自己感興趣; 它唯一的責任就是通知它的各觀察者. 這給了你在任何時刻增加和删除觀察者的自由.

4. 意外的更新 因為一個觀察者并不知道其它觀察者的存在, 它可能對改變目标的最終代價一無所知. (可以對Update定義一系列的類型, 這是這樣會破壞該模式的靈活性, 特别是在增加Update類型時.)(也可以這樣, 在綁定Observer對象時, 加入該對象感興趣的Update, 在Notify的中Update前進行判斷)

六. 我的了解

1. 文檔視圖就是使用了Observer模式, 我們要注意的是Subject中Observer的管理. SetState後Notify的中Update的判斷.

繼續閱讀