觀察者(Observer)模式也叫發佈/訂閱(Publish/Subscribe)模式,是 MVC( 模型-視圖-控制器)模式的重要組成部分。
天氣一直是英國人喜歡討論的話題,而最近幾年天氣的變化也成爲中國人很是關注的話題。我會根據天氣預報決定是坐地鐵仍是開車上班,個人女兒也會根據天氣預報決定明天穿哪件衣服。因而我在移動公司爲個人手機定製了天氣預報短信通知服務,它的工做模型如圖所示。
設計模式
天天氣象局將天氣預報信息投送給移動運營商,移動運營商的短信中心負責把天氣預報發送給定製過這項服務的手機。
在軟件系統中,一個對象狀態改變也會連帶影響其餘不少對象的狀態發生改變。可以實現這一需求的設計方案有不少,但可以作到複用性強且對象之間匿名通訊的,觀察者模式是其中最爲適合的一個。
實現原理
微信
它有4個角色,具體以下所示。
抽象主題(Subject)。抽象主題是一個接口,它是一個觀察者集合容器,定義了添加觀察者(add)函數、移除觀察者(remove)函數和爲全部觀察者發送通知的函數(notifyObserver)。
抽象觀察者(Observer)。抽象觀察者是一個接口,它有一個更新(update)函數。
具體觀察者(ConcreteObserver)。Observer接口的具體實現。
具體主題(ConcreteSubject)。Subject接口的具體實現。
引入Subject和Observer這兩個接口後,不只提升了系統的可複用性,還下降了耦合度。由於ConcreteSubject只須要一個實例,因此咱們採用單例設計模式實現。觀察者模式還能夠有其餘變形,若要深刻了解,能夠參考GoF。
通知機制
在Cocos2d-x框架中,觀察者模式的具體應用有一種通知(notification)機制。通知機制與委託機制不一樣的是,前者是「一對多」的對象之間的通訊,後者是「一對一」的對象之間的通訊。
如圖所示,在通知機制中對某個通知感興趣的全部對象均可以成爲接收者。首先,這些對象須要向通知中心(__NotificationCenter)調用addObserver函數進行註冊,在投送對象投送通知給通知中心時,通知中心就會把通知廣播給註冊過的接收者。全部的接收者都不知道通知是誰投送的,更不關心它的細節。投送對象與接收者是一對多的關係。接收者若是對通知再也不關注,會給通知中心調用removeObserver或removeAllObservers函數解除註冊,之後再也不接收通知。
框架
在參數回傳方面通知機制要比委託模式好不少。通知機制能夠實現一對多參數傳遞,而委託模式只是一對一參數傳遞。函數
更多內容請關注國內第一本Cocos2d-x 3.2版本圖書《Cocos2d-x實戰:C++卷》網站
本書交流討論網站:http://www.cocoagame.net
更多精彩視頻課程請關注智捷課堂Cocos課程:http://v.51work6.com
spa
歡迎加入Cocos2d-x技術討論羣:257760386.net
歡迎關注智捷iOS課堂微信公共平臺設計