单例、观察者模式
来源:互联网 发布:视频培训软件 编辑:程序博客网 时间:2024/06/07 03:53
============== 单例模式 =======================
单例模式是一种设计模式,即保证系统中只有一个类的实例,且该实例易于外界访问,从而方便对对象的访问,可以控制资源使用,个人理解类似于大家在一块黑板上讨论东西,不关心参与讨论的对象,单例就相当于黑板。
游戏中我一般在一个场景中设置一个GameController类为单例模式,其中提供若干辅助操作对象的方法,如控制参数设置,提供计算方法等,也会设置一个单例的声音管理器专门管理声音的统一播放。Unity中我这样设置单例。
public class GameManager : MonoBehaviour
{
private static GameManager _instance;
public static GameManager Instance //此段有时省略
{
get { return _instance; }
}
void Awake()
{
_instance = this; //使自身可被调用
}
}
常规写法:
public class Singleton{ static Singleton instance; public static Singleton Instance { get { if (instance == null) { instance = new Singleton (); } return instance; } }}
=========== 观察者模式 =============
有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
当我们玩游戏时,经常会出现一些事件,而这个事件可能会影响到许多个模块时就可以用到观察者模式。例如:当我们在游戏中被丧尸咬时,我们就触发了变身丧尸的特殊事件,此时我们本身的人物模型可能会改变,同时系统的背景音乐和战斗方式也可能改变。此时就是一个事件影响多个模块的状况了,就可以用到观察者模式,废话不多说直接上代码。
首先我们定义一个抽象类Observer,Obserber中我们定义抽象方法,这就是当我们接收到事件时要执行的方法了。
然后是定义一个抽象主题类,抽象主题类中包含添加和移除Observer的方法,定义一个Notify方法作为推送方法。我们推送消息到Observer链表中的各个Observer方法,Observer方法就开始执行监听的方法了。 具体主题类是真正实现要推送的消息,我们确认一个事件是否推送和如何推送消息的方法等都是在这里完成的。
观察者类,这个是获取推送消息时真正要执行的一段程序,在这里具体化要执行的程序的工作内容。
下面是完整的代码:
其实观察者模式可以这么理解,我们不妨把它看做是一个超市,具体观察者是超市的老板,老板要下达命令给员工,具体主题是超市的员工,员工收到了老板下达的命令就开始工作了,抽象主题就是一个任务表,任务表中包含所需要工作员工的名单,我们要告诉名单中的员工你别偷懒了,开始干活吧,抽象观察者就是一个工作的大致内容,例如:年底盘查,但是我们不去关心年底盘查具体的步骤该怎么做,怎么做的事情由员工自己来负责。
- 单例、观察者模式
- 单例模式和观察者模式
- 设计模式 - 单例、观察者(1)
- 音乐播放器--观察者模式+单例
- 设计模式--单例模式,观察者模式,适配器模式
- 设计模式系列之单例模式和观察者模式
- Java基础---单例模式 观察者模式 反射 工厂模式
- Unity3D-单例模式、观察者模式和工厂模式
- 6、android单例模式下使用观察者模式
- php设计模式--单例,工厂,观察者,策略模式
- 设计模式——单例模式、工厂模式、代理模式、观察者模式、装饰器模式
- javaweb+设计模式项目(单例、工厂、代理、观察者)
- Android中使用软件设计模式之观察者模式、Builder模式、单例模式、简单工厂模式
- 安卓设计模式,工厂模式/单例模式/观察者模式/代理模式/
- 安卓中的两种设计模式:单例模式,观察者模式
- C++ 两种设计模式:单例模式和观察者监听者模式
- php设计模式专题附源码(适配器模式、模板模式、命令模式、单例模式、观察者模式)
- php设计模式专题附源码(适配器模式、模板模式、命令模式、单例模式、观察者模式)
- 拷贝数组
- SQLite学习笔记
- 一小时搞明白自定义注解(Annotation)
- css属性
- Picasso 加载图片 缓存小结
- 单例、观察者模式
- openstack向社区提交代码及bug fix
- 刷题的日常[Leetcode]——27)Remove Element
- 安装OpenBlas(ubuntu 14.04)
- dedecms织梦自定义表单提交之后如何发送到邮箱!
- 【前端】gulp常用插件(代码整理)
- [BZOJ 1497][NOI2006]最大获利(最大权闭合图)
- 安卓仿知乎个人主页,实现嵌套滑动和渐隐效果
- 1.python基本数据结构-集合-方法