【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中定义: "提供一个代理者位置给一个对象,好让代理者可以控制存取这个对象." 代理模式多用来优化资源的加载 当资源已经加载过时,使用原来的资源 当资源没有加载过时,开始加载 ...
随机推荐
- Redis的两种持久化方式-快照持久化和AOF持久化
Redis为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边,数据保存到硬盘的过程就称为"持久化"效 ...
- 第二十章 Django数据库实战
第二十章 Django数据库实战 第一课 获取单表单数据的三种方式: urls.py中的路由代码: path('busniess',views.busniess), views.py中代码: def ...
- Centos7下,简单DOCKER 使用.映射SSH端口到宿主主机.
其实使用docker完全没有必要ssh,初学的时候,可以这样熟悉以下操作. 参考这哥们的文章:http://www.jianshu.com/p/d2dd936863ec 获取镜像 docker pul ...
- 老司机教你在windows不用软件隐藏重要文件
每个人电脑里面都有些秘密,但是别人需要使用你的电脑时,有可能会看到,但是我们又不想让别人发现时,我们可以将其隐藏,那么别人就不会看到了.360文件保险柜.腾讯电脑管家等等.使用软件繁琐软件过大还会拖慢 ...
- js 滚动到一定位置导航定位在页面最顶部
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- HI3531编译helloworld,执行错误
若在嵌入式系统中执行某文件出现如下错误: -/bin/sh: XXX: not found 一般是因为缺少库文件,解决方法有2: 1,文件系统的busybox编译时使用动态编译方式 2,或编译该文件的 ...
- FusionCharts 3D环饼图
1.设计静态页面 Doughnut.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"& ...
- linux下编译sphinx拓展
编译libsphinxclient sphinx 源码包里的api文件夹下的libsphinxclient cd /root/api/libsphinxclient/ ./configure make ...
- java.text.ParseException: Unparseable date: "2015-06-09 hh:56:19"
1.错误描述 [DEBUG:]2015-06-09 16:56:19,520 [-------------------transcation start!--------------] java.te ...
- Caused by: java.lang.ClassNotFoundException: com.mchange.v2.ser.Indirector
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...