天天看點

Java設計模式——觀察者模式觀察者模式

Java設計模式——觀察者模式

  • 觀察者模式
    • 定義
    • 結構
    • 類圖
    • 實作過程
    • 優點
    • 缺點
    • 一些了解

觀察者模式

定義

定義對象之間的一種一對多的依賴關系,使得每當一個對象狀态發生改變時其相關依賴對象皆得到通知并被自動更新。

結構

Subject(目标):目标又稱為主題,它是指被觀察的對象。

ConcreteSubject(具體目标):具體目标是目标類的子類,它通常包含有經常發生改變的資料。

Observer(觀察者):觀察者将對觀察目标的改變作出反應。

ConcreteObserver(具體觀察者):在具體觀察者中維護一個指向具體目标對象的引用,它存儲具體觀察者的有關狀态。

類圖

Java設計模式——觀察者模式觀察者模式

實作過程

建立一個抽象類(抽象目标),裡面定義了一些通知方法(通知觀察者)。然後定義一些類(具體目标)去繼承并實作裡面的方法。定義一個接口或者建立一個抽象類(抽象觀察者),同樣在裡面定義一些方法(例如收到目标類的通知之後執行的操作)。建立一些類去實作(或繼承)它(具體觀察者),并實作其中的方法。如果要和目标類互動,具體觀察者還要關聯或者依賴具體觀察者(根據具體情況判斷,可選項)。 目标類要通知觀察者類,抽象目标類和抽象觀察者類之間就要有關聯關系。

優點

  1. 可以實作表現層和資料邏輯層的分離。
  2. 在觀察目标和觀察者之間建立一個抽象的耦合。觀察目标隻需維持一個抽象觀察者的集合,無須了解其具體觀察者。由于觀察目标和觀察者沒有緊密的耦合在一起,是以它們可以屬于不同的抽象化層次。
  3. 支援廣播通信。簡化了一定多系統設計的難度。
  4. 符合開閉原則。

缺點

  1. 如果一個觀察和目标對象有很多直接和間接的觀察者,将所有的觀察者都會通知到會花費很多時間。
  2. 如果在觀察者和觀察目标之間存在循環依賴,觀察目标會觸發它們進行循環調用,可能導緻系統崩潰。
  3. 觀察者模式沒有相應的機制讓觀察者知道所觀察的目标對象是怎麼發生變化的,而僅僅隻是知道觀察目标發生的變化。

一些了解

觀察者模式主要實作的是這麼一個功能:通知一些對象,然後那些對象做出反應。例如,紅綠燈,紅燈亮的時候通知你紅燈已經亮了,然後你停下。