【Unity与23种设计模式】观察者模式(Observer)
GoF中定义:
“在对象之间定义一个一对多的连接方法,当一个对象变换状态时,其他关联的对象都会自动收到通知。”
现实中,社交网络就是个例子。
以前的报社,每次出新刊的时候,
报刊便会将新刊一本一本的送到订阅报刊人的手中
于是,每次出新刊,报社都得送到每个人的手中
而如今的微博,便是应用了观察者模式
当想关注某个人时,只需要点击关注便可订阅
当关注的人更新微博时,只需要更新到微博平台
订阅的人就可以接收到更新的消息
而不需要被关注的那个人向每个订阅者发送消息
C#中的事件系统(Event)便是使用的观察者模式
Unity中的所有事件(如UI点击事件)也是应用的观察者模式
//事件接口
public abstract class Subject {
List<Observer> m_Observers = new List<Observer>(); public void Attach(Observer theObserver) {
m_Observers.Add(theObserver);
} public void Detach(Observer theObserver) {
m_Observers.Remove(theObserver);
} public void Notify() {
foreach (Observer theObserver in m_Observers)
theObserver.Update();
}
}
//实现事件
public class ConcreteSubject : Subject {
string m_SubjectState; public void SetState(string state) {
m_SubjectState = state;
Notify();
} public string GetState() {
return m_SubjectState;
}
}
//观察者接口
public abstract class Observer {
public abstract void Update();
}
//实现观察者
public class ConcreteObserver : Observer {
string m_SubjectState; ConcreteSubject m_Subject = null; public ConcreteObserver(ConcreteSubject theSubject){
m_Subject = theSubject;
} public override void Update()
{
Debug.Log("ConcreteSubject.Update");
}
}
//测试类
public class TestObserver {
private void UnitTest() {
ConcreteSubject theSubject = new ConcreteSubject(); ConcreteObserver theObserver = new ConcreteObserver(theSubject);
theSubject.Attach(theObserver); theSubject.SetState("Subject状态1");
}
}
观察者模式的设计原理是,先设置一个主题(Subject)
让这个主题发布时可同时通知关心这个主题的观察者/订阅者
并且主题不必理会观察者/订阅者接下来会执行哪些操作
观察者模式的主要功能和优点:
将“主题发生”与“功能执行”这两个操作解除绑定
文章整理自书籍《设计模式与游戏完美开发》 菜升达 著
【Unity与23种设计模式】观察者模式(Observer)的更多相关文章
- 23种设计模式--观察者模式-Observer Pattern
一.观察者模式的介绍 观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...
- php 23种设计模式 - 观察者模式
观察者模式 某个对象可以被设置为是可观察的,只要通过某种方式允许其他对象注册为观察者.每当被观察的对象改变时,会发送信息给观察者. 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改 ...
- 【Unity与23种设计模式】解释器模式(Interpreter)
GoF中定义: "定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言." 传统上,执行程序代码通常通过两种方式 第一种:编译程序 第二种:解释器 常见的使用解释器的程 ...
- 【Unity与23种设计模式】原型模式(Prototype)
GoF中定义: "使用原型对象来产生指定类的对象,所以产生对象时,是使用复制原型对象来完成." Unity中 开发者可以组装游戏对象 它可以包括复杂的组件 组装好了之后,就可以将其 ...
- 【Unity与23种设计模式】适配器模式(Adapter)
GoF中定义: "将一个类的接口转换成为客户端期待的类接口.适配器模式让原本接口不兼容的类能一起合作." 适配器模式与装饰模式有一定的相似之处 两者都是在着手解决C#不能多继承的问 ...
- 【Unity与23种设计模式】命令模式(Command)
GoF中定义: "将请求封装成为对象,让你可以将客户端的不同请求参数化,并配合队列.记录.复原等方法来执行请求的操作." 实现命令模式的标准在于: 当请求被对象化后,对于请求对象是 ...
- 【Unity与23种设计模式】状态模式(State)
定义: "让一个对象的行为随着内部状态的改变而变化,而该对象也像是换了类一样" 应用场景: 角色AI:控制角色在不同状态下的AI行为 服务器连接状态:开始连线.连线中.断线等状态 ...
- 【Unity与23种设计模式】抽象工厂模式(Abstract Factory)
GoF中定义: "提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类." 意思就是 根据不同的执行环境产生不同的抽象类子类 抽象工厂模式经常在面试中会涉及到 下面的例 ...
- 【Unity与23种设计模式】代理模式(Proxy)
GoF中定义: "提供一个代理者位置给一个对象,好让代理者可以控制存取这个对象." 代理模式多用来优化资源的加载 当资源已经加载过时,使用原来的资源 当资源没有加载过时,开始加载 ...
随机推荐
- Ubuntu14.04上安装Composer
1,查看机子上有没有安装php 2,下载Composer的安装包 3,安装Composer 4,设置Composer全局可访问
- 让网站通过Https访问
Prerequisites Before you begin, you should have some configuration already taken care of. We will be ...
- HDU5992 - Finding Hotels
原题链接 Description 给出个二维平面上的点,每个点有权值.次询问,求所有权值小于等于的点中,距离坐标的欧几里得距离最小的点.如果有多个满足条件的点,输出最靠前的一个. Solution 拿 ...
- elasticsearch分词器Jcseg安装手册
Jcseg是什么? Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言 ...
- H3C路由交换常用命令
1.查看Linux下查看端口状态 root@root:~# netstat -an|grep -E "6002|6003" 2.H3C交换机显示当前配置 [H3C]display ...
- Oracle总结【SQL细节、多表查询、分组查询、分页】
前言 在之前已经大概了解过Mysql数据库和学过相关的Oracle知识点,但是太久没用过Oracle了,就基本忘了...印象中就只有基本的SQL语句和相关一些概念....写下本博文的原因就是记载着Or ...
- DNS 访问 Service - 每天5分钟玩转 Docker 容器技术(138)
在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问. kubeadm 部署时会默认安装 kube-dns 组件. ...
- js中的Object.defineProperty()和defineProperties()详解
ECMAS-262第5版在定义只有内部采用的特性时,提供了描述了属性特征的几种属性.ECMAScript对象中目前存在的属性描述符主要有两种,数据描述符(数据属性)和存取描述符(访问器属性),数据描述 ...
- pyinstaller打包py文件成exe文件时,出现ImportError: No module named 'pefile'错误解决办法!
首先pyinstaller的安装与使用详见如下链接: 安装完成之后,命令行中输入pyinstaller之后,结果如下: ImportError: No module named 'pefile' 缺少 ...
- 快速排序(QuickSort)
1.算法思想 快速排序是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). (1) 分治法的基本思想 分治法的基本思想是:将原 ...