【设计模式】Unity3D 观察者模式
行为型模式–观察者模式
提示:个人学习总结,如有错误,尽请指正
文章目录
- 行为型模式--观察者模式
- 一、观察者模式是什么?
- 二、UML图
- 三、抽象类实现(抽象通知者依赖抽象观察者)
- 1.抽象被观察者
- 2.抽象观察者
- 3.具体通知者
- 4.具体观察者
- 5.客户端
- 四、事件委托实现(抽象通知者不依赖抽象观察者)
- 1.具体观察者
- 2.通知者接口
- 3.具体通知者
- 4.客户端
- 五、好处与坏处
- 1.好处
- 2.坏处
- 六、适用场景
- 附
一、观察者模式是什么?
让代码宣称有趣的事情发生了,而不必关心到底是谁接受了通知。
事件与其他对象行为的解耦,如成就系统在什么时候响应成就,如果不小心就把代码写在很多奇怪的地方,而我们要做的就是让物理代码去声称“不知道有谁感兴趣,但是这个事情发生了”,成就系统接收到声称再去处理;再如社区通知打疫苗,居民打疫苗不应该由社区调用,而是居民收到通知后自己决定。
二、UML图
//TODO
三、抽象类实现(抽象通知者依赖抽象观察者)
1.抽象被观察者
它有两个任务。首先,它有一个列表,保存默默等它通知的观察者;然后就是发送通知
using System.Collections.Generic;
public abstract class Notifier
{private IList<Observer> observers = new List<Observer>();//添加观察者public void Attach(Observer observer){observers.Add(observer);}//移除观察者public void Detach(Observer observer){observers.Remove(observer);}public void Notify(){foreach (var item in observers){item.Update();}}
}
2.抽象观察者
为所有具体观察者定义一个接口,在得到通知时更新自己
抽象观察者一般用一个抽象类或者接口实现,更新接口通常包含一个Update方法(更新方法)
public abstract class Observer
{public abstract void Update();
}
3.具体通知者
内部状态改变时,给所有登记过的观察者发出通知。
广播
public class Radio : Notifier
{private string state;public string State { get; set; }
}
4.具体观察者
具体观察者可以保存一个指向具体主题对象的引用
using UnityEngine;
//射手
public class Shooter : Observer
{private Radio radio;public Shooter (Radio radio){this.radio = radio;}public override void Update(){Debug.Log("shoot now!");}public Radio Subject{get{ return radio; }set{ radio = value; }}
}
5.客户端
添加观察者,发送通知
using UnityEngine;
public class ObserveGame : MonoBehaviour
{private void Start(){Radio radio = new Radio();radio.Attach(new Shooter(radio, "1"));radio.Attach(new Shooter(radio, "2"));radio.State = "boom";radio.Notify();}
}
四、事件委托实现(抽象通知者不依赖抽象观察者)
1.具体观察者
using UnityEngine;
//射手1
public class Shooter1
{private Notifier notifier;private string name;public Shooter1 (Notifier Notifier ,string Name){this.notifier= Notifier ;this.name = Name;}public void shootTheRed(){Debug.Log(" I will shoot the red one!");}
}
using UnityEngine;
//射手1
public class Shooter2
{private Notifier notifier;private string name;public Shooter2 (Notifier Notifier ,string Name){this.notifier= Notifier ;this.name = Name;}public void shootTheGreen(){Debug.Log(" I will shoot the green one!");}
}
2.通知者接口
不再依赖抽象观察者
interface Notifier
{void Notify();string State{ get; set; }
}
3.具体通知者
使用delegate关键字
public class NotifyRadio : INotifer
{private string action;public delegate void Update();public Update update;public string State{get { return action; }set { action = value; }}public void Notify(){update();}
}
4.客户端
多播委托
using UnityEngine;
public class OberveManager : MonoBehaviour
{NotifyRadio notifyRadio = new NotifyRadio();void Start(){Shootor1 one = new Shootor1(notifyRadio, "1");Shootor2 two = new Shootor2(notifyRadio, "2");notifyRadio.update += one.shootTheRed;notifyRadio.update += two.shootTheGreen;}void Update(){if(Input.GetKeyDown(KeyCode.C)){notifyRadio.Notify();}}
}
五、好处与坏处
1.好处
1.表示层和数据逻辑层的分离,让耦合的双方都依赖于抽象,而不是依赖于具体。
2.满足“开闭原则”的要求,增加新的具体观察者无须修改原有系统代码
2.坏处
1.耗时?
发送通知只需简单地遍历列表,调用一些虚方法。只要这些方法不是特别耗时,否则这点消耗可以忽略。
2.观察者模式是同步的,你需要小心地在观察者中混合线程和锁。如果观察者试图获得被观察者拥有的锁,游戏就进入死锁了。在多线程引擎中,你最好使用事件队列来做异步通信。
六、适用场景
1.一个对象发生改变需要同时改变其它类
2.链式触发机制,疫情模拟(A传B,B传C)
附
1.大话设计模式
2.游戏设计模式
3.观察者模式
【设计模式】Unity3D 观察者模式相关推荐
- 设计模式:观察者模式--Observer
一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...
- java 观察者模式_图解Java设计模式之观察者模式
图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...
- 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?
前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...
- java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解
Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...
- 设计模式 C++观察者模式
无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个 ...
- 学习《图说设计模式》观察者模式
图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...
- 设计模式之观察者模式——猫抓老鼠2
设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...
- 设计模式之观察者模式——猫抓老鼠1
设计模式之观察者模式--猫抓老鼠: 问题描述: 通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类): using System;/// <summary> /// 观察者设 ...
- 设计模式学习--观察者模式(Observer Pattern)
设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热! 下午15:28 设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...
- 「设计模式(二) - 观察者模式」
「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...
最新文章
- html如何添加关闭按钮,大神你好,请问怎么在以下代码的div中添加一个关闭按钮?...
- 超简单-用协程简化你的网络请求吧,兼容你的老项目和旧的网络请求方式
- Leaflet中使用Leaflet.Graticule插件实现添加矩形格网
- PHP扩展-扩展的生成和编译
- bigint hive java类型_详解Apache Hudi如何配置各种类型分区
- dw1000信标码_DW1000方案工牌型UWB标签,助力10厘米高精度室内定位!
- YOLOv4改进版重磅问世!Yolov4扩展版!Yolov4原班人马重磅推出Scaled-YOLOv4: Scaling Cross Stage Partial Network
- po 价格条件表_海纳易拓图文讲解SAP MM模块采购价格条件
- 第二章 HTML5存储 JSON格式
- 因果推断笔记——DR :Doubly Robust学习笔记(二十)
- rest-framework框架的基本组件
- Java去除富文本编辑器中的格式标签
- Spring Boot配置QueryDSL(生成Query查询实体类,查询数据)
- 实现企业微信机器人自动发消息
- 高通蓝牙耳机(QCC3034)Sink开发基础教程一:高通蓝牙方案介绍及开发环境搭建
- 音频-什么是PCM编码格式?
- 百度2023校招 内推码IVV4AS
- sci计算机论文发表论文格式,SCI论文发表的格式以及字体的要求是什么?
- 邮件安全证书(S/MIME),如何申请邮件证书
- 让你大吃一惊的国外广告联盟