序:
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 ...