前言:

最近在网上浏览到一篇对软件设计模式概述的文章,说的相对通透易懂可以看看~
http://c.biancheng.net/view/1317.html

一、观察者模式的介绍

在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如:红灯停路灯行;下课铃声响起所有的学生走出教室自由活动等等。

在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用观察者模式来实现就非常方便。
模式的定义与特点

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

观察者模式是一种对象行为型模式,其主要优点如下
降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。
目标与观察者之间建立了一套触发机制。

它的主要缺点如下
目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

二、观察者简单代码

我们通过代码抽象理解一下观察者的原理和上文所说的缺点:

abstract class Subject {protected observers: Observer[] = [];//增加观察者方法public add(observer: Observer): void{this.observers.push(observer);}//删除观察者方法public remove(observer: Observer): void {this.observers.pop()// 简单使用伪代码进行删除}public abstract notifyObserver(): any; //通知观察者方法
}//具体目标
class ConcreteSubject extends Subject {public notifyObserver(): void{this.observers.forEach((obs) => {obs.response();});}
}
//抽象观察者
interface Observer {response(): any; //反应
}
//具体观察者1
class ConcreteObserver1 implements Observer {public response(): void{cc.log("具体观察者1作出反应!");}
}
//具体观察者1
class ConcreteObserver2 implements Observer {public response(): void{cc.log("具体观察者2作出反应!");}
}//使用的时候let subject: Subject = new ConcreteSubject();let obs1: Observer = new ConcreteObserver1();let obs2: Observer = new ConcreteObserver2();subject.add(obs1);subject.add(obs2);subject.notifyObserver();

三、cocosCreator中对观察者的使用

我们使用观察者的目的就是为解耦合,比如引擎中提供的cc.game:
1.在任意地方定义事件:cc.game.on;
2.在任意地方分发事件:cc.game.dispatchEvent;
使用起来相当方便,但记得既然注册了监听事件就要记得删除;有的时候我喜欢自己实现一个或者有的时候需要自己写一个类似的观察者。

并不严谨只是展示观察者的内部逻辑:

export default class EventCenter {private static eventMap: Map<string, EventHandler[]> = new Map<string, EventHandler[]>();//事件注册static registEvent(eventName: string, callBack: Function, target: Object): void {if (eventName == undefined || callBack == undefined || target == undefined) {return;}if (this.eventMap.get(eventName) == undefined) {this.eventMap[eventName] = new Array<EventHandler>();}let handler: EventHandler = new EventHandler(target, callBack);EventCenter.eventMap[eventName].push(handler);}//事件分发出去static postEvent(eventName: string, param?: any): void { //分发可以传递参数let handlers = EventCenter.eventMap[eventName];if (handlers == undefined) { return; }for (let i = 0; i < handlers.length; i++) {let handler = handlers[i]try {handlers.callBack.call(handler.target, param);}catch (errer) {cc.log(errer.message);cc.log(errer.stack.toString());}}}//删除事件static removeEvent(eventName: string, callBack: Function, target: Object): void {let handlers = EventCenter.eventMap[eventName];if (handlers == undefined) { return; }for (let i = 0; i < handlers.length; i++) {let handler = handlers[i]if (handler != undefined && handler.target == target && handler.callBack == callBack) {handler[i] = undefined;break;}}}
}//事件的结构
class EventHandler {target: object;callBack: Function;constructor(target: object, callBack: Function) {this.target = target;this.callBack = callBack;}
}

游戏中的事件管理--观察者模式的解读相关推荐

  1. pygame系列_游戏中的事件

    先看一下我做的demo: 当玩家按下键盘上的:上,下,左,右键的时候,后台会打印出玩家所按键的数字值,而图形会随之移动 这是客观上面存在的现象. 那么啥是事件呢? 你叫我做出定义,我不知道,我只能举个 ...

  2. 游戏开发入门(八)游戏中的场景管理

    视频链接:游戏开发入门(八)游戏中的场景管理(5节课 时常:约2小时07分钟) 授课者通过2D围棋的例子,逐步拓展成3D的虚拟游戏世界.这个3D游戏世界基本上就可以涵盖市面上所有类型的游戏了,我们通过 ...

  3. e的矩阵次方_利用状态转移矩阵和VBA求游戏中各种事件达成次数的期望

    在工作中计算经济数值的时候,经常会遇到需要计算各种事件完成期望的工作(比如计算集齐一套特定的卡牌搭配需要抽多少次--).本文就介绍一种比较快捷的计算方法. 一般来说,计算期望有以下几种方法: 依据期望 ...

  4. python异步框架twisted_详解Python的Twisted框架中reactor事件管理器的用法

    铺垫在大量的实践中,似乎我们总是通过类似的方式来使用异步编程: 监听事件 事件发生执行对应的回调函数 回调完成(可能产生新的事件添加进监听队列) 回到1,监听事件 因此我们将这样的异步模式称为Reac ...

  5. 游戏中的设计模式之观察者模式 笔记

    原文来自:https://github.com/TYJia/GameDesignPattern_U3D_Version 基本思想:事件与其他对象行为的解耦--例如一个代码描述了日本核电站爆炸的事件,世 ...

  6. 电子游戏设计与制作 第六章 游戏中的人工智能

    文章目录 1 游戏人工智能发展 2 游戏AI技术的分类 确定型AI算法 行为型AI算法 3 智能体agent与基本感官系统 Agent基本感官系统 智能体感官系统组成 智能体感官系统设计 4 路径规划 ...

  7. IT 部门事件管理模式建立分析

    1.研究背景和意义 IT 服务的最佳理论实践是 ITIL,ITIL 已经成为了解 IT 服务最简单直接的一套方法论.IT 服务管理简称为:ITSM.ITIL 为 ITSM 提供了专业术语和流程指导,告 ...

  8. Angular 4.x 事件管理器及自定义EventManagerPlugin

    在 Angular 中如何为同一个表达式绑定多个事件呢?如果我们这样做可能会是这样的: <div><button (click, mouseover)="onClick() ...

  9. 事件管理决定一个网管软件的成功与失败

    很多人用网管软件很长时间了,但是还是觉得用起网管软件来,很不方便.这是什么原因呢?认真分析种种原因,最终发现,原来是很多人并没有把网管软件中的事件管理用好. 什么是事件管理   首先向大家说明一下,什 ...

最新文章

  1. 实操指南 | Resource Queue如何实现对AnalyticDB PostgreSQL的资源管理?
  2. Memory Limits for Windows and Windows Server Releases
  3. golang 根据基础的url下载静态服务器上所有的文件
  4. STM32 ISP 下载程序, C源码,
  5. 关于 Error: No PostCSS Config found in 的错误
  6. CANOpen服务数据对象报文
  7. spring MVC interceptor post遇到问题
  8. 省市区三级联动菜单(附数据库)
  9. 【UE】UE4下载安装及测试demo
  10. java 中文 语义分析,了解Javac编译器 - xinlan1964的个人页面 - OSCHINA - 中文开源技术交流社区...
  11. android打开iso,安卓手机端如何运行iso镜像文件
  12. 重温数据结构与算法之单调栈
  13. 小丁带你走进git的世界三-撤销修改(转)
  14. 感知机(Perceptron)
  15. 第三届江西省高校网络安全技能大赛 部分wpCrypto的疑惑
  16. 10 个超好用的免费开源项目管理软件
  17. 日志搜集、过滤及推送处理框架logstash及fluentd总结
  18. 克33+9爆利拉德阿德32分 马刺24分大胜开拓者
  19. redis事件通知(notify-keyspace-events Ex)
  20. 学生选课管理系统 jsp + servlet + mysql (2021)

热门文章

  1. Mac 开发 打开系统偏好设置
  2. Windows内核开发调试环境配置详解
  3. win10计算机到桌面显示器,win10桌面右键菜单添加关闭显示器方法
  4. 【渝粤题库】国家开放大学2021春1040公司概论题目
  5. php微信小程序如何无限点赞,小程序点赞收藏功能
  6. 瑞芯微1126环境配置说明
  7. 《盗梦空间》完全解析
  8. 拉勾网数据分析师职位分析
  9. 王者的荣耀--Monza后记
  10. C# 获取移动硬盘和U盘信息