天天看點

Java23種設計模式——18.行為型模式之觀察者模式觀察者模式觀察者模式的定義與特點觀察者模式的結構與實作

Java中除去有設計原則之外,還有23中設計模式。

這些模式都是前輩們一點一點積累下來,一直在改進,一直在優化的,而這些設計模式可以解決一些特定的問題。

并且在這些模式中,可以說是将語言的使用展現的淋漓盡緻。

那我們今天要學習  行為型模式  中的  觀察者模式  !

觀察者模式

先來百科一下,什麼叫觀察者模式,具體是觀察什麼玩意

Java23種設計模式——18.行為型模式之觀察者模式觀察者模式觀察者模式的定義與特點觀察者模式的結構與實作

我們主要看第二句話,這第二句話可以用一個例子去了解

我們好比說一個班級,班主任之前是A,之後A要離職,B接管了A之前的班主任的工作,對于這個班級的學生來說,以後就得見了B就得叫一聲班主任

觀察者模式的定義與特點

觀察者(Observer)模式的定義:指多個對象間存在一對多的依賴關系,當一個對象的狀态發生改變時,所有依賴于它的對象都得到通知并被自動更新。這種模式有時又稱作釋出-訂閱模式、模型-視圖模式,它是對象行為型模式。

觀察者模式是一種對象行為型模式,其主要優點如下。

1. 降低了目标與觀察者之間的耦合關系,兩者之間是抽象耦合關系。

2. 目标與觀察者之間建立了一套觸發機制。

它的主要缺點如下。

1. 目标與觀察者之間的依賴關系并沒有完全解除,而且有可能出現循環引用。

2. 當觀察者對象很多時,通知的釋出會花費很多時間,影響程式的效率。

觀察者模式的結構與實作

實作觀察者模式時要注意具體目标對象和具體觀察者對象之間不能直接調用,否則将使兩者之間緊密耦合起來,這違反了面向對象的設計原則。

觀察者模式的主要角色如下:

1. 抽象主題角色:也叫抽象目标類,它提供了一個用于儲存觀察者對象的聚集類和增加、删除觀察者對象的方法,以及通知所有觀察者的抽象方法。

2. 具體主題角色:也叫具體目标類,它實作抽象目标中的通知方法,當具體主題的内部狀态發生改變時,通知所有注冊過的觀察者對象。

3. 抽象觀察者角色:它是一個抽象類或接口,它包含了一個更新自己的抽象方法,當接到具體主題的更改通知時被調用。

4. 具體觀察者角色:實作抽象觀察者中定義的抽象方法,以便在得到目标的更改通知時更新自身的狀态。

知道了這些内容之後,我們來看一下如何去使用觀察者模式

我們就實作一下上面的那個換班主任的這個例子

第一步:

我們先來定義一下抽象觀察者角色

Java23種設計模式——18.行為型模式之觀察者模式觀察者模式觀察者模式的定義與特點觀察者模式的結構與實作

第二步:

有了這個抽象觀察者之後,我們需要再弄兩個具體的實作類,一個是老師,一個是學生

Java23種設計模式——18.行為型模式之觀察者模式觀察者模式觀察者模式的定義與特點觀察者模式的結構與實作
Java23種設計模式——18.行為型模式之觀察者模式觀察者模式觀察者模式的定義與特點觀察者模式的結構與實作

第三步:

有了這些還不夠,我們還需要抽象目标類,我們需要将這些觀察者放到一起,一旦需要通知的時候,一起通知

Java23種設計模式——18.行為型模式之觀察者模式觀察者模式觀察者模式的定義與特點觀察者模式的結構與實作

第四步:

我們最後弄個具體的實作類,然後實作剛剛的抽象目标類

Java23種設計模式——18.行為型模式之觀察者模式觀察者模式觀察者模式的定義與特點觀察者模式的結構與實作

測試:

OK,有了這些之後我們就可以測試了

Java23種設計模式——18.行為型模式之觀察者模式觀察者模式觀察者模式的定義與特點觀察者模式的結構與實作

我們執行一下,看看會怎麼樣

Java23種設計模式——18.行為型模式之觀察者模式觀察者模式觀察者模式的定義與特點觀察者模式的結構與實作

可以看到,當我們執行 notifyObserver 的時候,會通知到所有的觀察者,而且每個觀察者都做出了他們各自應該有的反應

OK,就到這裡,大家好好看一下。多多練習。有問題可以聯系我QQ:2100363119

歡迎大家通路我的個人網站:lemon1234.com 感謝大家留言