設計模式之觀察者模式

2021-07-15 10:22:00 字數 2614 閱讀 1473

observer(觀察者模式)也被稱為發布-訂閱模式(publish-subscribe)。

gof的《設計模式》中將觀察者模式分類為一種物件行為型模型。它定義物件間一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件(觀察者)都會得到通知,並自動更新。

描述:

將乙個系統分割成一系列相互協作的類有乙個常見的問題,需要維護個物件之間的一致性。更多的在維護一致性的同時,我們不希望增強各類的耦合性,而降低各類的重用性。《設計模式》中典型的例子:對於同一組資料我們可以使用圖表、柱狀圖、餅狀圖等形式表現。假設我們將圖示的資料更改,為了統一需要將柱狀圖、餅狀圖的形式一併更改,即需要告知其他依賴於資料的物件得到資料更改的通知。

解決這個問題比較好的辦法是採用觀察者模式進行設計。上面例子中的行為表示:**物件,餅狀圖物件,柱狀圖物件對依賴於資料物件。當然依賴於資料物件的其他物件可能不止這幾個,可以是任意數量。

觀察者模式描述了這樣一種關係,即觀察者物件依賴於目標物件。乙個目標物件可以對應任意數目的觀察者物件。一旦目標物件發生改變,他的觀察者會得到通知。這樣觀察者通過更新資料使得各個觀察者之間的狀態一致。很明顯,上述模式是一種訂閱-發布模式。

更簡單的理解,我們都訂閱新聞雜誌,當編輯將新聞內容更新後,我們也會得到乙份新聞雜誌的副本,和任何乙個訂閱同一本新聞雜誌的讀者獲取的資訊都一樣。

觀察者模式的結構如下:

-subject(抽象目標)

-observer(抽象觀察者)

-concretesubject(具體目標物件)

-concreteobserver(具體觀察者物件)

例項:

subject:

/**

* 抽象目標介面 此處使用抽象類表示

* * @author guo

* */

abstract public class view

public void setstate(int state)

}

實現註冊觀察者、刪除觀察者、通知所有觀察者、狀態更新和獲取方式(可以在具體目標物件中實現),採用抽象類的方式實現。

observer:

/**

* 抽象觀察者介面

* @author guo

* */

public inte***ce observerlistener

抽象觀察者物件,實現更新介面,(可以新增其他介面方法),採用介面方式實現。

concretesubject:

/**

* 具體目標物件

* 實現抽象目標物件中的各個方法

* @author guo

* */

public class subjectview extends view

@override

protected void attach(observerlistener listener)

@override

protected void detach(observerlistener listener)

public void addlistener(observerlistener listener)

@override

protected void notify()

}}

實現抽象目標方法中的各個方法。繼承自抽象類subject(view)。

concreteobserver:

class mylistener implements observerlistener

@override

public void update(view v, int state) }

}

具體觀察者物件,實現抽象觀察者介面中的方法。

結果:

測試類

/**

* 觀察者模式:(publish/subscribe) 定義一種一對多的模式 角色: 1.抽象目標角色(subject)

* 2.抽象觀察者角色(observer) 3.具體目標角色(concrete subject) 4.具體觀察者角色(concrete observer)

* * @author guo

* */

public class observermodel

}

執行結果:

總結:

觀察者模式是一種物件行為型模式,它實現當目標狀態改變時,所有依賴於它的物件(觀察者)狀態都進行更新維護一致性。

上述例子只是簡單的一種實現方式,此外還有很多具體的實現方式,其他實現細節:狀態更新的拉模式、推模式,同乙個目標註冊不同的觀察者等。

設計模式之觀察者模式

首先說了乙個自己的小例子吧,前兩天我的乙個朋友來找我玩,因為路途比較遠,我需要知道他的位置,然後安排好時間去接他,那麼在這個例子中,我就是乙個觀察者,需要時時刻刻觀察他的位置,我的朋友就是乙個被觀察者。那麼需要知道我朋友的位置,就有兩種方式,第一,我自己打 問,第二,我的朋友告訴我,下面我們來看看這...

設計模式之觀察者模式

一 作用 讓多個觀察者監視某一物件的變化,如果物件變化,則通知所有觀察者。二 例子 抽象主題類 public abstract class subject 移除觀察者 public void detach observer observer 向觀察者 們 發出通知 public void notif...

設計模式之觀察者模式

觀察者模式的定義是 定義物件間的一種一對多的依賴關係。當乙個物件的狀態發生變化時,所有依賴它的物件都會得到通知並自動更新 報社跟讀者的例子 我們用報社和讀者之間的關係來模擬觀察者模式。包含以下主體 報社 news office 讀者介面 reader 具體讀者 reader 二逼青年 reader ...