观察者模式

一、需要注意的地方

同步、异步

(1)对事件同步响应,被观察者有可能会阻塞
(2)对事件异步响应,如果观察者试图获得被观察者的锁,游戏就进入死锁。要使用事件队列来做异步通信

动态分配内存

(1)观察者列表的添加和删除,需要动态分配内存。
(2)使用链式观察者,无需动态分配内存。当观察者接到通知,它返回了一个标识,表明被观察者是否应该继续遍历观察者列表。这涉及到职责链模式

销毁被观察者、观察者(云式原则:有始有终原则)

销毁被观察者,需要让观察者接收到一个“死亡通知”,自动取消注册
维基百科有个专门的名字:失效监听者问题

二、时代在变

观察者模式在面向对象编程中大行其道(Java中的java.util.Observer、C#中的delegate/event),但沉重而且死板。
例如:观察者只有一个OnNotify()方法,观察者监听多个被观察者,它不能为不同的被观察者调用不同的通知方法
作者的观点:
(1)C++克服了在没有垃圾回收语言构建闭包的弱点,甚至Java在JDK8中引入了闭包。(作者非常青睐C++,我也想学)
(2)倾向于注册一个成员函数指针作为观察者,而不是Observer接口的实例

原型模式

完全没看懂,作者很叼,我需要努力。

单例模式(避免使用)

优点:
全局唯一,需要时再创建实例,可继承
缺点:
(1)由于全局变量,到处被引用,促进耦合,代码理解困难(例如日志类)
(2)每个线程都能访问,却不知道其他线程是否正在使用,导致竞争、死锁。
(3)惰性初始化可能发生在游戏的性能高峰期,无法控制

总结:

(1)单例类有时候并不需要,非要装逼。可以使用基类、静态函数等
(2)使用单例,但不一定是全局访问(子类沙箱模式
PS.    惰性初始化要注意多线程问题

状态模式

单独写了一篇文章

转载于:https://www.cnblogs.com/fuyunzzy/p/7456346.html

《游戏编程模式》读书笔记之一相关推荐

  1. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记3

    技术非常多,样例非常多.仅仅好慢慢学,慢慢实践!!如今学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] JavaScript.jQ ...

  2. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记2

    技术很多,例子很多,只好慢慢学,慢慢实践!!现在学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] JavaScript.jQuer ...

  3. 简单使用Git和Github来管理自己的代码和读书笔记

    简单使用Git和Github来管理自己的代码和读书笔记 以前不知道使用代码管理工具,最后写的一些东西都没有了,由于硬盘坏了或者不小心格式化了之类的,后来使用了Git 和Github来托管自己的代码和读 ...

  4. 第一行代码 Android读书笔记(二)

    第一行代码 Android读书笔记 第三章 软件也要拼脸蛋-UI开发的点点滴滴 常用控件的使用方法 详解4种基本布局 自定义控件 最常用和最难用的控件-ListView 更加强大的滚动控件-Recyc ...

  5. 《第一行代码》读书笔记(七):album爬坑

    <第一行代码>读书笔记(七):album爬坑 权限问题 尽管书中提到4.4系统之前需要声明访问SD卡权限,不过很遗憾,4.4系统之后仍然需要 照片不显示问题 Android10对文件访问权 ...

  6. 《梦断代码》读书笔记——第3、4、5章

    只觉得这段时间事儿太多了,本应该周五就应该写的读书笔记一直拖到今天. 读完这几章,我主要收获了以下几点:计算机编程语言的发展由低级语言到高级语言,高级语言是在低级语言的基础上发展起来的,低级语言不应该 ...

  7. 代码大全阅读笔记02

    第二部分:创建高质量的代码 第一部分主要介绍了开发过程和需求分析,强调了构建的重要性,可以说十介绍了技术层面的一些东西.第二部分把目光放到了更加细节的地方,也开始看到了一些代码.内容十分全面,也写了很 ...

  8. 《梦断代码》读书笔记

    梦断代码,英文名是DREAM IN DODE.梦断代码,原作是美国的Scott Rosenberg,经韩磊翻译而来. 为什么选择读这本书?在图书馆软件工程处翻阅时,被这本书的名字吸引住了,同时之前也听 ...

  9. Linux命令行与Shell脚本编程大全读书笔记

    Linux内核4大主要功能: 内存管理 进程管理 设备管理 文件系统管理 Linux系统启动的进程和脚本管理 1./etc/inittab   管理系统开机时会自动启动的进程 2./etc/init. ...

  10. 《梦断代码》读书笔记1

    刚开始看到书名时,我感觉这个名字非常好,梦断代码,代码是我们每个学习计算机同学的噩梦,有多少人是讨厌当码农的.怀着好奇的心情,开启了我这本书的阅读旅程. 首先看到的是CSDN的总裁和Discuz创始人 ...

最新文章

  1. Python pip安装命令
  2. 软件工程编码阶段_软件工程的编码阶段
  3. 怎么制作app?0编程外卖平台系统开发
  4. 【JavaEE Spring】SpringBoot 日志文件详解
  5. 清华大学计算机系本科课程,清华大学计算机系本科生全部课程详细介绍
  6. python基础篇——函数
  7. HTML5 如何让背景图片自适应浏览器大小
  8. 【学习技巧和心得】 - 如何将学习资源转化成图文笔记?
  9. mac屏保怎么不显示,mac屏保怎么关闭
  10. word2007制作封面、扉页和目录
  11. python压缩图片--指定压缩大小且保真压缩
  12. day27 学习HTML-01天
  13. 如何检测机器是否支持TPM
  14. 常用稳压二极管参数表
  15. 如何基于共享服务器模式shared server mode配置大池large pool
  16. Ansoft Maxwell学习
  17. MATLAB机器人工具箱 机械臂仿真
  18. 最优化方法:四、一维搜索法
  19. 早起打卡赚钱的同时,养成好习惯,你能吗?
  20. 数字化交付模式下三维数字化工厂建设

热门文章

  1. mysql 关联更新_MySQL 规范
  2. php5.3 with-mysql centos_Centos编译搭建php7让php5.3和php7兼容共存教程
  3. python中打开文件提示编码当时错误_Python:文件编码错误
  4. python实现struct_Python实现结构体代码实例
  5. android 无法显示SD卡目录,Android studio无法在SD卡上创建新目录?
  6. python中解决中文乱码
  7. 用Python发送邮件
  8. linux删除最后一个字符串,Bash删除字符串中的第一个和最后一个字符
  9. CSS中使用flex弹性布局实现上下左右垂直居中排列并设置子元素之间的间距
  10. Leaflet中使用Leaflet.MagnifyingGlass实现放大镜效果