設計模式-觀察者模式

該模式定義了一個一對多的關係,一個被觀察對象與一群觀察對象存在依賴關係,一旦這個被觀察對象有什麼風吹草動,其他的觀察者就都能收到通知。其實本質是被觀察對象通知所有觀察者對象。

軟體系統很多時候需要這樣的情況,一旦發生故障,就通知對應的系統或模塊,使之能夠及時處理。

觀察者類圖結構

  • 抽象主題 Subject:提供添加和減少觀察者方法和通知觀察者方法;

  • 具體主題ConcreteSubject:對抽象主題的實現,包含一個觀察者的集合[這裡是介面哦,我們是針對介面編程的],用以操作與觀察者之間的互動;

  • 抽象觀察者 Observer:提供被主題調用的方法,一旦主題變動,就調用這個方法;

    Advertisements

  • 具體觀察者 ConcreteObserver:對抽象觀察者的抽象調用方法進行實現。

有了上面的類圖,很快就把代碼切出來:

以上就是抽象主題的基本代碼,大抵上可以完成任務了

抽象觀察者,這裡簡化,只有一個公開方法被主題調用

接下來把具體的主題構造出來,如下所示

其主要任務就是綁定和解綁觀察者,以及有事通知觀察者,當然可以對觀察者進行分類,根據分類再進行通知。

最後是具體的觀察者,主要工作代碼如下

運行下來看看

非常完美的實現了主題通知觀察者。需要注意的是,在具體主題裡面的集合容器最好不要使得外界可以修改,以及線程安全方面需要考慮。

另外一種方式把主題作為抽象類,然後關聯到抽象觀察者,而具體主題負責把狀態改變后,調用抽象的通知方法;

Advertisements

來段代碼實際情況看看;

這個抽象主題比較能幹,把子類要做到事多包攬了,子類的工作就輕鬆多了,來看下

具體主題就實現了一個方法,頓時輕鬆,觀察者和上面一樣,來看下客戶端怎麼使用

JDK 自帶了觀察者模式的一些基本類,可以使用,但最好還是自己造一個更方便,裡面的源碼可以借鑒看看,考慮的很詳細。

Advertisements

你可能會喜歡