行为型模式–观察者模式

提示:个人学习总结,如有错误,尽请指正


文章目录

  • 行为型模式--观察者模式
  • 一、观察者模式是什么?
  • 二、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 观察者模式相关推荐

  1. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

  2. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  3. 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?

    前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...

  4. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  5. 设计模式 C++观察者模式

    无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个 ...

  6. 学习《图说设计模式》观察者模式

    图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...

  7. 设计模式之观察者模式——猫抓老鼠2

    设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...

  8. 设计模式之观察者模式——猫抓老鼠1

    设计模式之观察者模式--猫抓老鼠: 问题描述: 通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类): using System;/// <summary> /// 观察者设 ...

  9. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  10. 「设计模式(二) - 观察者模式」

    「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...

最新文章

  1. html如何添加关闭按钮,大神你好,请问怎么在以下代码的div中添加一个关闭按钮?...
  2. 超简单-用协程简化你的网络请求吧,兼容你的老项目和旧的网络请求方式
  3. Leaflet中使用Leaflet.Graticule插件实现添加矩形格网
  4. PHP扩展-扩展的生成和编译
  5. bigint hive java类型_详解Apache Hudi如何配置各种类型分区
  6. dw1000信标码_DW1000方案工牌型UWB标签,助力10厘米高精度室内定位!
  7. YOLOv4改进版重磅问世!Yolov4扩展版!Yolov4原班人马重磅推出Scaled-YOLOv4: Scaling Cross Stage Partial Network
  8. po 价格条件表_海纳易拓图文讲解SAP MM模块采购价格条件
  9. 第二章 HTML5存储 JSON格式
  10. 因果推断笔记——DR :Doubly Robust学习笔记(二十)
  11. rest-framework框架的基本组件
  12. Java去除富文本编辑器中的格式标签
  13. Spring Boot配置QueryDSL(生成Query查询实体类,查询数据)
  14. 实现企业微信机器人自动发消息
  15. 高通蓝牙耳机(QCC3034)Sink开发基础教程一:高通蓝牙方案介绍及开发环境搭建
  16. 音频-什么是PCM编码格式?
  17. 百度2023校招 内推码IVV4AS
  18. sci计算机论文发表论文格式,SCI论文发表的格式以及字体的要求是什么?
  19. 邮件安全证书(S/MIME),如何申请邮件证书
  20. 让你大吃一惊的国外广告联盟

热门文章

  1. [ 江枫]关于ORA_ROWSCN
  2. 【软件测试】——软件测试经验总结
  3. 分享学JavaScript的第十天
  4. 如何用matlab画一个球
  5. traditional 和conventional区别
  6. 1. Boost.Asio入门
  7. 生活随记 - 被摩拜app忽悠了
  8. 内容公链Contentos首席科学家不建议刚毕业的年轻人直接从事区块链开发
  9. java启动后台进程_windows下java -jar 后台运行以及杀死后台进程的操作
  10. OSPF报文与LSA