行為型設計模式: 觀察者模式(Observer Pattern)
CSDN專欄: 設計模式(UML/23種模式)
觀察者模式(Observer Pattern): 定義對象間的一種一對多的依賴關系, 當一個對象的狀态發生改變時, 所有依賴于它的對象都得到通知并被自動更新。
觀察者模式(Observer Pattern)屬于行為型模式。行為型模式涉及到算法和對象間職責的配置設定;行為型模式不僅描述對象或類的模式,還描述它們之間的通信模式。行為型模式刻劃了在運作時難以跟蹤的複雜的控制流;它們将你的注意力從控制流轉移到對象間的聯系方式上來。行為型模式主要包括:Chain of Responsibility模式、Command模式、Interpreter模式、Iterator模式、Mediator模式、Memento模式、Observer模式、State模式、Strategy模式、Template Method模式和Visitor模式。行為型模式在某種程度上具有相關性。
模式簡介
GOF的《設計模式》指出Observer模式的意圖是:
定義對象間的一種一對多的依賴關系, 當一個對象的狀态發生改變時, 所有依賴于它的對象都得到通知并被自動更新。
将一個系統分割成一系列互相協作的類有一個常見的副作用:需要維護相關對象間的一緻性。我們不希望為了維持一緻性而使各類緊密耦合,因為這樣降低了它們的可重用性。
Observer模式适用于以下場景:
- 當一個抽象模型有兩個方面, 其中一個方面依賴于另一方面。将這二者封裝在獨立的對象中以使它們可以各自獨立地改變和複用。
- 當對一個對象的改變需要同時改變其它對象, 而不知道具體有多少對象有待改變。
- 當一個對象必須通知其它對象,而它又不能假定其它對象是誰。換言之, 你不希望這些對象是緊密耦合的。
模式圖解
Observer模式的UML示例如下:
Observer模式的工作過程如下:
- Subject目标知道它的觀察者。其支援若幹個觀察者觀察同一個目标;提供注冊和删除觀察者對象的接口。
- Observer觀察者為那些在目标發生改變時需獲得通知的對象定義一個更新接口。
- ConcreteSubject具體目标将有關狀态存入各ConcreteObserver對象, 并通知觀察者其狀态變化。
- ConcreteObserver具體觀察者維護一個指向ConcreteSubject對象的引用,其通過Observer更新接口保持自身狀态與目标狀态一緻。
Observer模式的有益效果如下:
- 有利于目标和觀察者間的松耦合:目标對象可以有若幹個觀察者,目标對象不關心觀察者的行為。
- 支援廣播通信。目标對象發送的通知不需指定它的接收者,通知被自動廣播給所有已向該目标對象登記的有關對象。
- 如果依賴準則的維護不當,很難捕捉這種錯誤更新。
Mediator模式: 通過封裝複雜的更新語義, ChangeManager充當目标和觀察者之間的中介者。 ChangeManager可使用Singleton模式來保證它是唯一的并且是可全局通路的。
模式執行個體
[TODO]
系列文章
- CSDN專欄: 設計模式(UML/23種模式)
- Github專欄: 設計模式(UML/23種模式)
參考文獻
- GOF的設計模式:可複用面向對象軟體的基礎
- 設計模式之禅
- 圖說設計模式