1. 程式人生 > >Java 設計模式(九)《觀察者模式》

Java 設計模式(九)《觀察者模式》

觀察者模式

當物件間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個物件被修改時,則會自動通知它的依賴物件。觀察者模式屬於行為型模式。

所屬型別: 行為型

標籤:

  • Java
  • Gang Of Four
  • Difficulty-Beginner(入門級難度)

注:

什麼是 GOF(四人幫,全拼 Gang of Four)?
在 1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名為 Design Patterns - Elements of Reusable Object-Oriented Software(中文譯名:設計模式 - 可複用的面向物件軟體元素) 的書,該書首次提到了軟體開發中設計模式的概念。
四位作者合稱 GOF(四人幫,全拼 Gang of Four)。他們所提出的設計模式主要是基於以下的面向物件設計原則。
對介面程式設計而不是對實現程式設計。
優先使用物件組合而不是繼承。

意圖

定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。

解決問題

一個物件狀態改變給其他物件通知的問題,而且要考慮到易用和低耦合,保證高度的協作。

public abstract class Observer {

    protected Subject subject;

    /**
     * 通知其他關係類進行更新
     */
    abstract void update();
}

完整程式碼

何時使用

一個物件(目標物件)的狀態發生改變,所有的依賴物件(觀察者物件)都將得到通知,進行廣播通知。

使用場景

  1. 一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這些方面封裝在獨立的物件中使它們可以各自獨立地改變和複用。
  2. 一個物件的改變將導致其他一個或多個物件也發生改變,而不知道具體有多少物件將發生改變,可以降低物件之間的耦合度。
  3. 一個物件必須通知其他物件,而並不知道這些物件是誰。
  4. 需要在系統中建立一個觸發鏈,A物件的行為將影響B物件,B物件的行為將影響C物件……,可以使用觀察者模式建立一種鏈式觸發機制。

注意事項:

  1. JAVA 中已經有了對觀察者模式的支援類。
  2. 避免迴圈引用。
  3. 如果順序執行,某一觀察者錯誤會導致系統卡殼,一般採用非同步方式。

優點:

  1. 觀察者和被觀察者是抽象耦合的。
  2. 建立一套觸發機制。

缺點:

  1. 如果一個被觀察者物件有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。
  2. 如果在觀察者和觀察目標之間有迴圈依賴的話,觀察目標會觸發它們之間進行迴圈呼叫,可能導致系統崩潰。
  3. 觀察者模式沒有相應的機制讓觀察者知道所觀察的目標物件是怎麼發生變化的,而僅僅只是知道觀察目標發生了變化。

實際應用