请求队友支援之观察者模式

307 阅读3分钟

这是我参与新手入门的第3篇文章

前言

其实说到观察者模式,对我们来说并不陌生,"红灯停,绿灯行"就是一个很明显的例子:大家过马路时盯着交通信号灯,根据交通信号灯的状态来做出相应的行为,停止等待还是前进。结合到我们代码中,有些前辈大神也经常使用观察者模式来做一些套件来方便我们日常的开发,例如大家周知的UniRx就是一个典型的例子。

定义

观察者模式定义了对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相关的依赖对象都得到通知并自动更新。哦?观察者模式又称作发布-订阅者模式你知道的不?
观察者模式主要包含以下四个角色:

  • 目标(抽象):又称为被观察者,在它内部定义了一个观察者的对象列表,它提供一系列方法来增加和删除观察者,通知它还需定义一个Notify方法,用来通知所有观察者自己的状态发生了更新。
  • 具体目标:被观察者的子类,功能与目标类相似,是目标类的具体实现。
  • 观察者(抽象):观察者将在被观察者的状态发生改变时,做出相应的改变,观察者一般定义为接口,该接口声明了更新数据的方法,因此有成为抽象观察者。
  • 具体观察者:在具体观察者中维护一个指向目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致,它实现了抽象观察者中定义的update方法。

代码举例

在多人联机对战游戏中,多个玩家可以组队,当战队中的一名成员受伤时将给其他所有的队员发生通知,队友收到之后将作出响应。 首先我们分析,我们需要一个控制中心类,让其充当我们的观察者,而我们的每一个队员就是一个被观察者,即:目标。

  • 抽象观察者: image.png
  • 具体观察者: image.png
  • 抽象被观察者:

image (1).png

  • 具体被观察者:

image (2).png

测试验证

image (3).png

image.png

总结

观察者模式的适用环境:

  • 1、一个对象改变将导致一个或多个对象发生改变,且不知道具体有多少个对象将要发生改变,也不清楚这些对象到底是谁。
  • 2、抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使用它们可以各自独立的改变和复用。
  • 3、系统中建立一个触发链,A对象触发B,B触发C...,可以使用观察者模式创建一种链式触发机制。