設計模式之觀察者模式

2021-09-01 04:16:08 字數 2258 閱讀 8259

觀察者模式用簡單通俗的說法解釋:觀察者模式=出版者+訂閱者

通常在觀察者模式中有兩個角色,主題和觀察者,主題和觀察者之間的關係如下:

具體類圖如下:

subject 主題介面
public inte***ce subject
public class store implements subject 

@override

public void removeobserver(observer observer)

}@override

public void notifyobservers()

}public void updatemessage(string message)

}

observer 觀察者介面
public inte***ce observer
public class consumer implements observer 

}

現在基本的觀察者模式就已經實現了,我們來測試一下

public static void main(string args)
控制台列印資訊:

超市發布打折通知:今天商場有****商品打折,速速搶購

消費者收到通知今天商場有****商品打折,速速搶購

以上就是最基礎的觀察者模式。其實觀察者模式有兩種從訂閱主題獲取資訊的方式

推送資料:由訂閱主題主動推送資料,不在乎觀察者是否需要該條資料,統一給全部訂閱該主題的消費者推送。

拉取資料:訂閱主題資訊發生改變時,通知觀察者,由觀察者主動獲取自己需要的資料。

推送資料有乙個缺陷主題就是無法針對具體的觀察者推送不同資料,而拉取資料相當於把決定權轉交給了觀察者,主題可以發布所有資料,但是觀察者可以根據自己實際需要獲取自己想要的資料,拉取資料主題通常會把自己傳遞給觀察者,觀察者通過主題物件公開方法(例:get方法)獲取自身想要的資料。

很明顯,我們剛剛上面實現的是推資料的一種模式,若此時消費者還想觀察某一款商品的**,在低於某乙個**時,消費者能夠即時得到通知。

下面我們繼續通過拉資料的模式進行改造

subject 主題,主題沒有發生改變
public inte***ce subject
public class store implements subject 

@override

public void removeobserver(observer observer)

}@override

public void notifyobservers()

}public void updatemessage(string message)

public string getmessage()

public void setmessage(string message)

public int getmilkprice()

public void setmilkprice(int milkprice)

}

observer 觀察者,觀察者的更新方法相應改變,引數不在是具體的屬性,而是主題物件
public inte***ce observer
consumer 消費者,當牛奶**低於45時,能夠即時得到通知
public class consumer implements observer }}

接下來測試一下

public static void main(string args)
控制台:

超市發布打折通知:暫無打折商品

牛奶最新**40,速速搶購吧!

恩,此時主題能靈活的應對各個消費者不同的需求,消費者也能夠根據自身需要訂閱不同的訊息。我們也通過這個例子演示了拉取資料模式。

參考書籍《head first設計模式》

設計模式之觀察者模式

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

設計模式之觀察者模式

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

設計模式之觀察者模式

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