觀察者的痛點到底在**呢?讓我們用購物來做例程,假設某件商品(水果手機)賣得非常火爆,長期處於脫銷的狀態。由於供不應求,師徒四人也加入了搶購的隊伍,不時的去商店詢問是否有貨,先看商店類**。
1public class shop
7 //商店出貨
8 public string getproduct()
11 //商店進貨
12 public void setproduct(string product)
15}
簡單易懂,然後是買家類,充當觀察者角色。
1public class buyer
910 public void buy()
14}
注意第3行買家持有商店的引用,用來在第10行的購買行為中獲取商品,最後是客戶端類來模擬買家與商家的互動。
1public class client
25}
看到這些買家的瘋狂行為沒有?一開始師傅命三位徒弟去搶購,商店一直處於無貨狀態,師傅坐立難安,也加入了搶購大軍,最終徒兒剛鬣脫穎而出,終於搶到了夢寐以求的手機,整個過程堪比九九八十一難。
大家有沒有發現問題?除了最後一步目的達成之外,之前的部分都是在做無用功,並且此處**只是模擬了師徒四人而已,真實情況並非如此簡單,可能會有成千上萬的瘋狂粉絲不斷詢問有沒有到貨,商家的店員可能會被逼瘋。
到這裡大家肯定已經想到了,與其讓觀察者不斷的詢問不如當到貨的時候讓商家主動通知觀察者們來買吧,換個角度分析問題馬上迎刃而解,醍醐灌頂般清爽,開始設計優雅觀察者的模式,首先從商家類開始重構。
1public class shop
1011 // 為了主動通知買家,買家得來店裡註冊。
12 public void register(buyer buyer)
1516 public string getproduct()
1920 public void setproduct(string product)
2425 // 通知所有註冊買家
26 public void notifybuyers()
29}
注意第12行的註冊方法,所有關注商品的買家都應先註冊(訂閱),比如告知商家手機號以便第20行到貨後可以接到通知,以及第26行的通知方法對所有買家進行迭代,並呼叫買家的inform進行告知。所以這裡我們規定,對於buyer買家必須要有inform方法,這是對各類形形色色買家的定製行為,故我們對買家類進行抽象如下。
1public abstract class buyer
1011 public abstract void inform();
1213}
很簡單,我們對買家進行了抽象,其中第11行inform方法必須得到實現,通知到你了怎樣處理自己看著辦咯。注意第8行注掉的**,構造時強制將自己註冊入商家名單,但為了靈活起見我們暫讓買家自行決定是否註冊。接下來我們來看眾買家都是些什麼樣的人,首先是果粉買家。
1public class phonefans extends buyer
6 7 @override
8 public void inform()
14 }
15}
買家的行為各式各樣,在第8行實現了父類抽象行為,接到通知後他做了邏輯判斷,很明顯這類買家只稀罕水果牌手機,別的商品不是他的菜。再來看另一類剁手黨買家。
1public class handchopper extends buyer
6 7 @override
8 public void inform()
13}
與果粉不同,他是來者不拒,只要有貨就買買買!最後來看客戶端的神操作。
1public class client
19}
無與倫比地優雅,第6行開始對瘋狂買家師徒二人進行註冊,於是他們再也不見他們終日徘徊於店門之外苦苦等待的身影了。接下來某日商店到貨(第10行),至此購買過程就這樣神奇地結束了,不信?看輸出結果,嗯,不單買家很奇葩,連店都很奇葩。總之,商家只要到貨就會馬上打**給這些訂閱買家告知可以購買了。
其實,最初商家與買家之間的互動行為非常類似於web應用中的poll行為,由於http無狀態連線協議的安全特性,服務端(商家)無法主動推送(push)訊息給客戶端(買家),所以有時會用到poll技術,也就是不斷的輪詢服務端,有沒有更新?有沒有更新?有沒有更新?嚴重時,成千上萬的客戶端會造成伺服器癱瘓,所以之後誕生的websocket正是為了解決這個問題,這便類似於我們的觀察者模式。
觀察者模式解決了基於一對多物件結構關係間的互動問題,使觀察者(多方買家)專主動為被動,被觀察者(單方商家)轉被動為主動,此情此景,需動靜結合,先後有序,以【一方動多方靜】取代【多方動一方靜】的模式,大大的提高了溝通效率,別再**了,我show給你好看。
python觀察者模式 python 觀察者模式
python 觀察者模式 前言e 寫的倉促就不截uml類圖了,書本chapter10,p313能看到圖 一旦觀察的主題有更新,就會通知到觀察者們,下面的例子是最簡單的乙個觀察者範例,假設這是一群投機分子密切關注 軍 火 倉庫的產品與數量變動 class inventory def init self...
觀察者模式
觀察者模式 observer 完美的將觀察者和被觀察的物件分離開。舉個例子,使用者介面可以作為乙個觀察者,業務資料是被觀察者,使用者介面觀察業務資料的變化,發現資料變化後,就顯示在介面上。物件導向設計的乙個原則是 系統中的每個類將重點放在某乙個功能上,而不是其他方面。乙個物件只做一件事情,並且將他做...
觀察者模式
觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,讓他們能夠自動更新自己 任何乙個模式都是離不開角色的,這裡也會有幾種角色 抽象主題角色 把所有對觀察者物件的引用儲存在乙個集合中,每個抽象主題角色都可以有任意數量的觀察...