【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中定义: "提供一个代理者位置给一个对象,好让代理者可以控制存取这个对象." 代理模式多用来优化资源的加载 当资源已经加载过时,使用原来的资源 当资源没有加载过时,开始加载 ...
随机推荐
- textarea只允许上下调节尺寸
对于extarea,因为如果不做限制的话,它是可以自由调节尺寸的,对于这一点我相信用户是非常喜欢的,因为每个人都有自己认为合适的尺寸,但是对于前端来说就比较头疼了,因为随意调节宽高,就会破坏整体布局, ...
- Springdata mongodb 版本兼容 引起 Error [The 'cursor' option is required, except for aggregate with the explain argument
在Spring data mongodb 中使用聚合抛出异常 mongodb版本 为 3.6 org.springframework.dao.InvalidDataAccessApiUsageExce ...
- scrapy学习总结
1.为了配合XPath,Scrapy除了提供了 Selector 之外,还提供了方法来避免每次从response中提取数据时生成selector的麻烦 Selector有四个基本的方法(点击相应的方法 ...
- Linux的软链接和硬链接
1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节点 ...
- Photoshop 样式的角度/高度选择器控件
Conmajia © 2012 Updated on Mar. 5, 2018 简介 Adobe Photoshop有两个非常专业的控件:角度选择器和角度与高度选择器,如图1所示. 图1 两种控件外观 ...
- Android安全开发之WebView中的大坑
0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等.WebView功能强大 ...
- DriverStudio 和 WDF驱动 通过GUID获取设备句柄的差别
DriverStudio /***************************************************************************** * 功能: 通过 ...
- strcmp函数实现
/* 功能:比较字符串s1和s2大小. 一般形式:int strcmp(字符串1,字符串2) 说明: 当s1<s2时,返回-1 当s1=s2时,返回 0 当s1>s2时,返回 1 即两个字 ...
- (十九)java小练习
练习1:计算13-23+33-43+--+993-1003的结果 package demo; /** * 计算13-23+33-43+--+993-1003的结果 * @author tu ...
- HTML5可以省略全部标记的元素
HTML5可以省略全部标记的元素 1.body 2.colgroup 3.html 4.head 5.tbody