日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]Cocos2d-x观察者模式

發布時間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]Cocos2d-x观察者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Cocos2d-x設計模式發掘——觀察者模式

1、應用場景

在cocos2d-x中的CCNotificationCenter類,它除了應用單例模式以外,還應用了觀察者模式。CCNotificationCenter類是觀察者模式中的目標對象,而CCNotificationObserver則是觀察者。

一個目標對象可以注冊多個觀察者,當目標對象的狀態改變的時候,可以通知觀察者對象作出相應的響應。這是標準的觀察者模式的實現,但是CCNotificationCenter稍微有些許差別。

首先,CCNotificationCenter不是通過自身狀態改變來通知觀察者,而是通過顯式地發送觀察者感興趣的消息(postNotification)來通知它們。每一種消息類型可以對應多個觀察者,同時,每一個觀察者也可以“觀察”多個消息類型。其次,觀察者定義相應的響應事件同消息類型關聯,當某個地方觸發postNotification來廣播一個消息的時候,CCNotificationCenter會遍歷所有的觀察者,判斷它們注冊的消息類型是否匹配,如果匹配,則觸發相應的注冊響應事件。最后,該觀察者模式采用的是推模型,即由目標對象去通知所有的觀察者。

其實CCNotificationCenter和CCNotificationObserver更準確的叫法是:訂閱發布模式。

?

2、使用此模式的優缺點

優點:

1)實現了目標對象和觀察者之間的抽象耦合,在本例中,則是實現了消息與觀察者的抽象耦合。可以定義一種消息與消息處理對象的一對多的關系,而不用擔心彼此的實現細節。

2)觀察者模式可以定義某種意義上的廣播通信機制。

3)實現訂閱者與發布者的松散耦合,同時保障了良好的擴展性。

缺點:

1)注冊成為CCNotificationCenter的觀察者后,如果忘記調用removeObserver,則會引起內存泄漏。因為addObserver會把觀察者的引用計算加1。

?

3、此模式的定義及一般實現

定義:

定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。

UML圖:

?

一般實現:

可以參考CCNotificationCenter.h和CCNotification.cpp文件的實現。

?

4、游戲開發中如何運用此模式

我們考慮cocos2d-x中一個非常典型的應用場景,你的GameScene里面有兩個layer,一個gameLayer,它包含了游戲中的對象,比如玩家、敵人等。另一個層是HudLayer,它包含了游戲中顯示分數、生命值等信息。如何讓這兩個層相互通信。

1)第一種辦法,你可以讓gameLayer包含一個hudLayer的引用,同時也可以讓hudLayer包含一個gameLayer的引用。注意!這里問題出現了,如果兩個類都包含彼此的強引用(所謂強引用就是retain),就會引起循環引用的情況,如果其中一個類包含的是弱引用,問題就不會出現。循環引用是使用引用計數管理內存的一個致命弱點,會導致資源永遠得不到釋放,而且查錯起來非常麻煩。

2)第二種辦法,把gameScene做成一個單例,同時讓gameScene包含gameLayer和hudLayer的弱引用,這樣就可以直接通過[GameScene sharedInstance].gameLayer或者[GameScene sharedInstance].hudLayer來訪問了。

3)第三種辦法,使用gameLayer->getParent()獲得gameScene,再使用gameScene來獲得hudLayer。

4)第四種辦法,使用CCNotificationCenter。當hudLayer注冊它感興趣的消息,當gameLayer需要通知hudLayer的時候,只需通過CCNotificationCenter發送一個對應的消息即可。

?

5、此模式與其它模式的關系

觀察者模式是實現MVC模式的重要組成部分,一個model可以對應多個views,model就是目標對象,而view則是觀察者,當model改變的時候,要通知所有的view也相應的改變。

轉載于:https://www.cnblogs.com/Clin/archive/2013/05/06/3063076.html

總結

以上是生活随笔為你收集整理的[转]Cocos2d-x观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。