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)的更多相关文章

  1. 23种设计模式--观察者模式-Observer Pattern

    一.观察者模式的介绍      观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...

  2. php 23种设计模式 - 观察者模式

    观察者模式 某个对象可以被设置为是可观察的,只要通过某种方式允许其他对象注册为观察者.每当被观察的对象改变时,会发送信息给观察者. 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改 ...

  3. 【Unity与23种设计模式】解释器模式(Interpreter)

    GoF中定义: "定义一个程序设计语言所需要的语句,并提供解释来解析(执行)该语言." 传统上,执行程序代码通常通过两种方式 第一种:编译程序 第二种:解释器 常见的使用解释器的程 ...

  4. 【Unity与23种设计模式】原型模式(Prototype)

    GoF中定义: "使用原型对象来产生指定类的对象,所以产生对象时,是使用复制原型对象来完成." Unity中 开发者可以组装游戏对象 它可以包括复杂的组件 组装好了之后,就可以将其 ...

  5. 【Unity与23种设计模式】适配器模式(Adapter)

    GoF中定义: "将一个类的接口转换成为客户端期待的类接口.适配器模式让原本接口不兼容的类能一起合作." 适配器模式与装饰模式有一定的相似之处 两者都是在着手解决C#不能多继承的问 ...

  6. 【Unity与23种设计模式】命令模式(Command)

    GoF中定义: "将请求封装成为对象,让你可以将客户端的不同请求参数化,并配合队列.记录.复原等方法来执行请求的操作." 实现命令模式的标准在于: 当请求被对象化后,对于请求对象是 ...

  7. 【Unity与23种设计模式】状态模式(State)

    定义: "让一个对象的行为随着内部状态的改变而变化,而该对象也像是换了类一样" 应用场景: 角色AI:控制角色在不同状态下的AI行为 服务器连接状态:开始连线.连线中.断线等状态 ...

  8. 【Unity与23种设计模式】抽象工厂模式(Abstract Factory)

    GoF中定义: "提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类." 意思就是 根据不同的执行环境产生不同的抽象类子类 抽象工厂模式经常在面试中会涉及到 下面的例 ...

  9. 【Unity与23种设计模式】代理模式(Proxy)

    GoF中定义: "提供一个代理者位置给一个对象,好让代理者可以控制存取这个对象." 代理模式多用来优化资源的加载 当资源已经加载过时,使用原来的资源 当资源没有加载过时,开始加载 ...

随机推荐

  1. uva12563

    一个简单的0-1背包,背包容量为t-1,每个物品价值为1,代价为t[i].背包容量为t-1而不是t的原因是留1s唱<劲歌金曲>. AC代码: #include<cstdio> ...

  2. [HNOI2014]道路堵塞

    题目描述 A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有从城市1到城市N ...

  3. Luogu P1522 牛的旅行 Cow Tours

    题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...

  4. 微信Token小识

    在调用自定义菜单接口的时候,调用接口 https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN返回: " ...

  5. ActiveMQ的运用

    MQ的消息队列模式有2种,一种是点对点模式,一种是订阅模式. 点对点模式:点对点的模式主要建立在一个队列上面,当连接一个列队的时候,发送端不需要知道接收端是否正在接收,可以直接向ActiveMQ发送消 ...

  6. 实战DeviceIoControl 之四:获取硬盘的详细信息

    Q 用IOCTL_DISK_GET_DRIVE_GEOMETRY或IOCTL_STORAGE_GET_MEDIA_TYPES_EX只能得到很少的磁盘参数,我想获得包括硬盘序列号在内的更加详细的信息,有 ...

  7. BIOS简介

    BIOS简介: BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统".其实,它是一组固化到计 ...

  8. JavaScript获取屏幕和页面的宽度和高度

    JavaScript获取屏幕和页面的宽度和高度 1.设计源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...

  9. C# Split 根据组合字符进行拆分数组用法

    C# Split 根据组合字符进行拆分数组用法,如下代码: string sql = "aaaaaaaaaa{@}bbbbbbbbbb{@}ccccccc#cccccc"; //1 ...

  10. Reactor-反应器模式

    Reactor模式:反应器模式,是高性能网络服务器中最为常用的一种模式,libevent,muduo,libuv等网络库都是以 Reactor模式构建.Reactor模式由同步事件多路分解器和具体事件 ...