观察者模式

1.通俗的定义

触发事件的一方不关心谁来处理,处理事件的一方不关心事件是从哪里来的。观察者模式就是让观察者与被观察者彻底解耦。

2.2.结构图如下(图片来源与网络):

3.游戏开发中的使用

当我们设计一个成就系统的时候,往往要在各个系统都要增加判断,比如杀死某种怪物多少只,新手往往可能这么写:

public static KILL_1009_COUNT = 0;
main () {//killMonster是杀死一个怪物,返回杀死怪物的idint id = killMonster();//如果杀死的怪物是1009那么数量加一,超过100次达成成就if (id == "1009") {KILL_1009_COUNT++;if (KILL_1009_COUNT > 100) {print("达成成就!杀死1009怪物100次!");}}
}

如果这样写下去,后果将不堪设想:各个类直接将会超级耦合,成就判断将会蔓延到整个项目的每个角落!观察者模式就是为了解决这个问题而出现的。观察者模式让代码彻底解耦,还是上面的那个例子:

main () {//killMonster是杀死一个怪物,返回杀死怪物的idint id = killMonster();//发送消息,杀死怪物,并将杀死的怪物id一起发送notify(EVENT_KILL_MONSTER, id);
}

这样代码的各个功能就不用关心成就相关的逻辑,只是通知我做了这样一件事情就可以了。同样,游戏中这样的例子到处都是,比如增加经验时,我们发送增加经验的消息,接收消息的地方来处理到底升没升级,因为可以增加经验的地方有很多,这样我们就不用导出判断是否升级了。
       下面看一下观察者的实现:

//处理观察者与被观察者
class Notification {//一个可变的观察者列表private List observerList = null;//该类是单例(后面我们会单独讲单例模式)private static Notification _instance = null; public static getInstance() {if (_instance == null) {_instance = new Notification();//初始化列表容器observerList = new ArrayList();}return _instance;}//添加观察者public void addObserver(Observer obs) {if (!observerList.isExistobs {observerList.add(obs);}}//删除观察者public void removeObserver(Observer obs) {observerList.remove(obs);}//广播消息public void sendMsg(String event, ..) {for (Observer obs : observerList) {if (obs.event == event) {obs.onNotify(..);}}}
}//观察者基类
class Observer {String event;//接收消息函数,event是消息类型,后面是参数void onNotify(..)//添加观察者void addObserver(String event) {event = event;Notification.getInstance().addObserver(this);}
}//杀怪成就观察者
class AchievementObserver extends Observer {void onNotify(id) {if (id == 1009) {//处理杀1009怪的成就逻辑} else if (id == 1010) {//处理杀1010怪的成就逻辑}}
}main () {//killMonster是杀死一个怪物,返回杀死怪物的idint id = killMonster();//发送消息,杀死怪物,并将杀死的怪物id一起发送Notification.getInstance().sendMsg(EVENT_KILL_MONSTER, id);
}

然后在写一个成就管理类来管理各种成就观察者,这样各个成就直接也可以解耦。

其他问题:

1.引用销毁问题:这个问题容易造成内存泄漏,就是在这个观察者不再使用时,一定记得将其remove,否则这个观察者一直在引用着,不会被释放。

2.同步异步问题:sendMsg这个函数中是在主线程按加入顺序进行发送的,在特殊情况下根据需要可以使用多线程来实现。

3.其他应用:观察者模式在MVC这种结构下也经常使用,control来处理逻辑,通过观察者来相应UI事件。

观察者模式的优点就是可以做到完全的解耦;缺点就是使用不当会让程序难以维护和调试。

关注我的公众号Ituuz_coder,第一时间推送新文章:

设计模式在游戏开发中的应用之观察者模式相关推荐

  1. 游戏开发中常用的设计模式 【game design patterns】

    单例模式(Singleton Pattern):用于确保在游戏中只存在一个实例,例如游戏管理器(Game Manager)或资源管理器(Resource Manager). 工厂模式(Factory ...

  2. 坦克大战游戏开发中的设计模式总结

    坦克大战游戏开发中的设计模式总结 github地址: https://github.com/2017403603/TankGame_Simple1.0.git https://github.com/2 ...

  3. [命令模式]在游戏开发中的应用

    设计模式中的每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动. 一个设计模式,它的服务对象是高层模块,在设计模式中称为客 ...

  4. 为什么在游戏开发中我不喜欢用MVC系列模式了

    为什么在游戏开发中我不喜欢用MVC系列模式了: 1,代码繁冗,当你阅读别人的代码,一个很简单的逻辑,被封装了多次,需要在多个代码文件中索引,阅读效率极低.代码文件分散,一些很简单的逻辑,例如按钮点击, ...

  5. 游戏开发中的各种角色浅析

    在以往的游戏开发中,我们往往需要处理很多角色,围绕着这些角色的组织形式,解耦等话题,出现了很多复合设计模式.例如:pureMVC,MVVM ,MVC 等等.对于这些设计模式,都是有利有弊,有他自己的使 ...

  6. [Unity设计模式与游戏开发]工厂模式

    前言 工厂模式(Factory Design Pattern)也是游戏开发中比较常用的创建型模式,一般情况下,工厂模式分为三种更加细分的类型:简单工厂.工厂方法和抽象工厂.在GoF设计模式一书中,它将 ...

  7. MANA框架在wap游戏开发中的应用

    Apache MINA框架 用户 IoService>IoProCessor>IoFilter>IoFilter>IoFilter>IoHandler 从左至右Reads ...

  8. 一些语法在游戏开发中的应用

    一些语法在游戏开发中的应用 一.减少不必要的全局变量 二.动态二维数组 三.整数转换为字符串输出 四.播放音乐模板 一.减少不必要的全局变量 游戏开发中有些变量只需要在少数函数中传递,修改数值.如果不 ...

  9. J2ME游戏开发中时钟的简单实现

    在java.util包中有一个TimerTask类,你可以扩展这个类并且实现他的run()方法,在run()方法中编写我们的逻辑代码.如果我们想制作一个游戏时钟,那么非常简单我们编写一个GameClo ...

  10. Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(

    2019独角兽企业重金招聘Python工程师标准>>> 在Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(百搜技术) 在Java ME游戏开发中,经常需要进行碰撞检测 ...

最新文章

  1. aspose word copy 获取某页的内容_6月已至,Aspose.Words又双叒叕更新到v20.6!PDF版本1.5标记过时...
  2. 注意,ruby循环体定义的变量在结束时后,变量还存在
  3. 50个Android开发技巧(09 避免用EditText对日期进行验证)
  4. Unity TIP3: 注入现有对象
  5. 编辑器eslint格式_vscode保存代码,自动按照eslint规范格式化代码设置
  6. Android全局异常捕获
  7. C++小白课本练习3
  8. Java的switch case 语句
  9. 免费的matlab程序学习下载网站总结
  10. 数字音频分析和处理系统
  11. 理解SpringAOP-菜鸟新手入门
  12. VBA单元格、工作表、工作簿
  13. 2022-2027年中国家用清洁产品行业发展监测及投资战略研究报告
  14. Java多线程篇--concurrentHashMap
  15. 低功耗蓝牙ATT/GATT/Profile/Service/Characteristic解读
  16. pc版android系统 app,掏空国产App,这国产系统究竟想干啥?
  17. [Luogu4182][USACO18JAN]Lifeguards P[单调队列]
  18. Think Python读书笔记及课后习题---【前三章】
  19. phpstorm 使用指南
  20. 51单片机定时器初值计算详解

热门文章

  1. 那些堪比照片质感的PhotoRealistic Style Transfer系列
  2. vue实例的watch选项
  3. 关于Binder (AIDL)的 oneway 机制
  4. 有限域(2)——理想和商环
  5. matlab中stract用法_matlab初学之strcat、num2str
  6. 广告市场VUCA时代来了!怎么办?
  7. iterable、iterator和iter()
  8. 迭代器 iter()函数与next()函数 for...in...循环的本质
  9. 【胶囊网络-CapsNet】胶囊网络-CapsNet原理
  10. 《深度学习之美》第2章