觀察者模式用簡單通俗的說法解釋:觀察者模式=出版者+訂閱者
通常在觀察者模式中有兩個角色,主題和觀察者,主題和觀察者之間的關係如下:
具體類圖如下:
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 ...