赞
踩
本文也是对观察者模式的一个回顾
观察者模式:
又叫做 发布-订阅 模式。定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时,会通知所有的观察者对象,让他们能够自动更新。
观察者模式的作用:
观察者模式其实就是在解除耦合,让耦合的双方都依赖抽象,而不是依赖于具体的实现,使得各自的变化都不会影响另一边的变化。
适用的地方:
思路是提供一个抽象的消息通知者。通知者具有基础的订阅、发布、取消的方法,并带有一个字典,字典用来记录以及储存不同类型的观察者事件。根据事件类型的不同,通过委托链的方式来调用一系列同类型的事件。
- 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()中要去写明取消订阅的逻辑
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。