观察者(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中有不少的设计模式,本系列教程主要讨论Cocos2d-x中的设计模式,看看引擎都使用了哪些设计模式,我们今后写代码要怎样使用某种设计模式。
《赵云要格斗》系列博文对应的代码与资源,不懂处看博文:http://blog.csdn.net/evankaka/article/details/42813085
一个用cocos2d-x实现的简单工厂模式的demo,博客文章的配套资源代码。
c++中应用的观察着模式,软件环境是cocos2d-x,因为个人觉得还是很详细的思维值得借鉴。只是代码,没有readme文档导读
cocos2d作为手机2d游戏开发的优秀工具,在实际应用时多与屏幕触摸结合,本书详细介绍了触摸机制,是了解手机游戏开发的绝好材料
解决cocos2d中文乱码的demo, 在win和android平台下验证成功
一个使用cocos2d-x层级窗口消息机制的小Demo。
该资源主要用于cocos2d-x中Value与json字符串的相互转换,提供从json文件读取为cocos2d::Value,cocos2d::Value写入到文件,cocos2d::Value转换为json字符串,json字符串转换为cocos2d::Value。json字符串转换成cocos...
是你在游戏开发时的备忘录,支持c++,lua,js语言,方便快捷
cocos2d-x中文显示 cocos2d-x v2.2.0
基于cocos2D制作的小游戏
cocos2dx3.0final版本的帮助文档,界面是中文的,内容是英文 使用时,双击压缩包中的index.html
手机游戏,可以写在C++或者Lua中,使用API是Cocos2d-iPhone完全兼容。Cocos2d-x项目可以很容易地建立和运行在iOS,Android,黑莓Blackberry等操作系统中。Cocos2d-x还支持Windows、Mac和Linux等桌面操作系统,因此,...
这是我自主编写的基础游戏源码,用作了我当时学习结束cocos这门课程时,用来期末答辩的。适合刚入门的cocos的人士,下载学习
IOS开发中因为引入cocos2dx,导致代码审核不通过无法提交( Apple will stop accepting submissions of apps that use UIWebView APIs )。该问题的解决方案有两种:1)升级Cocos2dx的版本,在查看Cocoas官网及Cocoas...
游戏开发之Cocos2D游戏引擎教程-cocos builder,cocos studio,cocos2d
下下来后,请在VC++包含目录中链接(F:\cocos2d-x-2.1.4\cocos2dx\platform\win32;F:\cocos2d-x-2.1.4\cocos2dx\platform\third_party\win32\OGLES\GL\;F:\cocos2d-x-2.1.4\cocos2dx\platform\third_party\win32\...
cocoscreator 翻牌效果cocoscreator 翻牌效果cocoscreator 翻牌效果
一个解决cocos2d中不能正常显示中文的小办法。