設計模式之觀察者模式

2021-07-11 15:33:27 字數 2669 閱讀 7766

總體來說設計模式分為三大類:

建立型模式5種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式7種:介面卡模式、裝飾器模式、**模式、外觀模式、橋接模式、組合模式、享元模式。

行為型模式11種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。

又叫發布-訂閱(publish/subscribe)模式、模型-檢視(model/view)模式、源-***(source/listener)模式或從屬者(dependents)模式。

在該模式中,又分為推模型和拉模型兩種方式。

推模型

主題物件向觀察者推送主題的詳細資訊,不管觀察者是否需要,推送的資訊通常是主題物件的全部或部分資料。

拉模型

主題物件在通知觀察者的時候,只傳遞少量資訊。如果觀察者需要更具體的資訊,由觀察者主動到主題物件中獲取,相當於是觀察者從主題物件中拉資料。一般這種模型的實現中,會把主題物件自身通過update()方法傳遞給觀察者,這樣在觀察者需要獲取資料的時候,就可以通過這個引用來獲取了。

兩種模式的比較

①推模型是假定主題物件知道觀察者需要的資料;而拉模型是主題物件不知道觀察者具體需要什麼資料,沒有辦法的情況下,乾脆把自身傳遞給觀察者,讓觀察者自己去按需要取值。

②推模型可能會使得觀察者物件難以復用,因為觀察者的update()方法是按需要定義的引數,可能無法兼顧沒有考慮到的使用情況。這就意味著出現新情況的時候,就可能提供新的update()方法,或者是乾脆重新實現觀察者;而拉模型就不會造成這樣的情況,因為拉模型下,update()方法的引數是主題物件本身,這基本上是主題物件能傳遞的最大資料集合了,基本上可以適應各種情況的需要。

物件之間一對多的依賴關係,乙個物件狀態改變,其他相關聯的物件就會得到通知並被自動更新。

所涉及的角色有:

①抽象主題(subject)角色

抽象主題角色把所有對觀察者物件的引用儲存在乙個聚集(比如arraylist物件)裡,每個主題都可以有任何數量的觀察者。抽象主題提供乙個介面,可以增加和刪除觀察者物件,抽象主題角色又叫做抽象被觀察者(observable)角色。

②具體主題(concretesubject)角色:

將有關狀態存入具體觀察者物件;在具體主題的內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色又叫做具體被觀察者(concrete observable)角色。

③抽象觀察者(observer)角色:

為所有的具體觀察者定義乙個介面,在得到主題的通知時更新自己,這個介面叫做更新介面。

④具體觀察者(concreteobserver)角色:

儲存與主題的狀態自恰的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新介面,以便使本身的狀態與主題的狀態 像協調。如果需要,具體觀察者角色可以保持乙個指向具體主題物件的引用。

demo:本次以常用的推模型為案例

首先,建立介面

public inte***ce subject
public inte***ce observer
其次,建立具體的實現類
public class

mytopic

implements

subject

@override

public void register(observer obj)

@override

public void unregister(observer obj)

@override

public void notifyobservers()

for (observer obj : observerslocal)

}@override

public object getupdate(observer obj)

public void postmessage(string msg)

}

public class

mytopicsubscriber

implements

observer

@override

public void update() else

system.out.println(name+":新訊息:"+msg);

}@override

public void setsubject(subject sub)

}

然後,建立測試類
public class

observerpatterntest

}

最後,檢視輸出結果

obj1 :沒有新訊息

收到新訊息啦

obj1 :新訊息:各位童鞋請注意

obj2 :新訊息:各位童鞋請注意

obj3 :新訊息:各位童鞋請注意

設計模式之觀察者模式

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

設計模式之觀察者模式

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

設計模式之觀察者模式

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