观察者模式
1.通俗的定义
触发事件的一方不关心谁来处理,处理事件的一方不关心事件是从哪里来的。观察者模式就是让观察者与被观察者彻底解耦。
2.2.结构图如下(图片来源与网络):
3.游戏开发中的使用
当我们设计一个成就系统的时候,往往要在各个系统都要增加判断,比如杀死某种怪物多少只,新手往往可能这么写:
如果这样写下去,后果将不堪设想:各个类直接将会超级耦合,成就判断将会蔓延到整个项目的每个角落!观察者模式就是为了解决这个问题而出现的。观察者模式让代码彻底解耦,还是上面的那个例子:
这样代码的各个功能就不用关心成就相关的逻辑,只是通知我做了这样一件事情就可以了。同样,游戏中这样的例子到处都是,比如增加经验时,我们发送增加经验的消息,接收消息的地方来处理到底升没升级,因为可以增加经验的地方有很多,这样我们就不用导出判断是否升级了。 下面看一下观察者的实现:
然后在写一个成就管理类来管理各种成就观察者,这样各个成就直接也可以解耦。
其他问题:
1.引用销毁问题:这个问题容易造成内存泄漏,就是在这个观察者不再使用时,一定记得将其remove,否则这个观察者一直在引用着,不会被释放。
2.同步异步问题:sendMsg这个函数中是在主线程按加入顺序进行发送的,在特殊情况下根据需要可以使用多线程来实现。
3.其他应用:观察者模式在MVC这种结构下也经常使用,control来处理逻辑,通过观察者来相应UI事件。
观察者模式的优点就是可以做到完全的解耦;缺点就是使用不当会让程序难以维护和调试。