行為型模式--Observer模式(觀察者)對象行為型模式
一. 意圖
定義對象間的一種一對多的依賴關系, 當一個對象的狀态發生改變時, 所有依賴于它的對象都得到通知并被自動更新. 這一模式中的關鍵對象是目标(subject)和觀察者(observer). 一個目标可以有任意數目的依賴它的觀察者. 一旦目标的狀态發生改變, 所有的觀察者都得到通知. 作為對這個通知的響應, 每個觀察者都将查詢目标以使其狀态與目标的狀态同步.
Web中的MVC, MFC中的文檔視圖都是這個模式.
二. 适用性
當一個抽象模型有兩個方面, 其中一個方面依賴于另一方面. 将這二者封裝在獨立的對象中以使它們可以各自獨立地改變和複用。
當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變.
當一個對象必須通知其它對象, 而它又不能假定其它對象是誰. 換言之, 你不希望這些對象是緊密耦合的.
三. 模式結構
圖1
四. 角色說明
Subject(目标)
—目标知道它的觀察者. 可以有任意多個觀察者觀察同一個目标.
—提供注冊和删除觀察者對象的接口.
Observer(觀察者)
—為那些在目标發生改變時需獲得通知的對象定義一個更新接口.
ConcreteSubject(具體目标)
—将有關狀态存入各ConcreteObserver對象.
—當它的狀态發生改變時, 向它的各個觀察者發出通知.
ConcreteObserver(具體觀察者)
—維護一個指向ConcreteSubject對象的引用.
—存儲有關狀态,這些狀态應與目标的狀态保持一緻.
—實作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的判斷.