本文也是对观察者模式的一个回顾
观察者模式:
又叫做 发布-订阅 模式。定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时,会通知所有的观察者对象,让他们能够自动更新。
观察者模式的作用:
观察者模式其实就是在解除耦合,让耦合的双方都依赖抽象,而不是依赖于具体的实现,使得各自的变化都不会影响另一边的变化。
适用的地方:
- 当一个对象需要同时改变其它对象的时候,而它不知道有多少对象需要改变时
- 当一个抽象模型有两方面时,其中一个方面依赖与另一方面,观察者模式可以将这两者封装在独立的对象中使它们各自独立改变和复用。
思路是提供一个抽象的消息通知者。通知者具有基础的订阅、发布、取消的方法,并带有一个字典,字典用来记录以及储存不同类型的观察者事件。根据事件类型的不同,通过委托链的方式来调用一系列同类型的事件。
using System;
using System.Collections.Generic;
public class MessageCenter
{
private Dictionary<string, Action<object>> subscribers = new Dictionary<string, Action<object>>();
public void Subscribe(string messageType, Action<object> action)
{
if (!subscribers.ContainsKey(messageType))
{
subscribers[messageType] = action;
}
else
{
subscribers[messageType] += action;
}
}
public void Unsubscribe(string messageType, Action<object> action)
{
if (subscribers.ContainsKey(messageType))
{
subscribers[messageType] -= action;
}
}
public void Publish(string messageType, object message)
{
if (subscribers.ContainsKey(messageType))
{
subscribers[messageType]?.Invoke(message);
}
}
}
public class Program
{
public static void Main()
{
MessageCenter messageCenter = new MessageCenter();
// 订阅消息类型为 "Greeting" 的消息
messageCenter.Subscribe("Greeting", (message) => Console.WriteLine("Received greeting: " + message));
// 发布消息类型为 "Greeting" 的消息
messageCenter.Publish("Greeting", "Hello, World!");
// 取消订阅消息类型为 "Greeting" 的消息
messageCenter.Unsubscribe("Greeting", (message) => Console.WriteLine("Received greeting: " + message));
}
}
使用委托的方式进行驱动,跟原先的观察者模式相比,使得观察者对象不用再去实现消息更新接口,并且需要更新的方法也不用使用相同的名称,但是必须拥有相同的参数列表和返回类型。
在事件的订阅和取消方面需要及时的去操作,否则可能带来一些影响。
如果订阅的某个函数所属对象被销毁,但事件中心仍有记录,此时再去推送信息就会导致内存泄漏,因此在该对象的OnDestroy()中要去写明取消订阅的逻辑