在实际的开发过程中经常遇到这样一个问题:游戏的很多个界面同时开着的,这些界面又共享一部分数据信息,需要实时的动态的刷新这些数据信息。
设计思路:
构造全局的事件监听器,在每个界面打开时做好相应数据的监听事件,当数据发生改变时只需要派发相应的事件即可。
using System.Collections.Generic;
public delegate void GameEventHandler(params object[] args);
public class GlobalEvent
{
/// <summary>
/// 事件池
/// </summary>
private static Dictionary<System.Enum, List<GameEventHandler>> eventListeners = new Dictionary<System.Enum, List<GameEventHandler>>();
/// <summary>
/// 添加监听事件
/// </summary>
/// <param name="type">监听事件</param>
/// <param name="listener">监听回调</param>
public static void ListenEvent(System.Enum type, GameEventHandler listener)
{
List<GameEventHandler> listeners;
if (!eventListeners.TryGetValue(type, out listeners))
{
listeners = new List<GameEventHandler>();
eventListeners.Add(type, listeners);
}
listeners.Add(listener);
}
/// <summary>
/// 移除监听
/// </summary>
public static void RemoveEvent(System.Enum type, GameEventHandler listener = null)
{
if (listener == null)
{
eventListeners.Remove(type);//直接移除同类的所有监听
}
else
{
//移除指定的监听
List<GameEventHandler> listeners;
if (eventListeners.TryGetValue(type, out listeners))
{
if (listeners.Contains(listener))
{
listeners.Remove(listener);
}
if (listeners.Count <= 0)
{
RemoveEvent(type);
}
}
}
}
/// <summary>
/// 调用监听事件
/// </summary>
public static void Dispatch(System.Enum type, params object[] args)
{
List<GameEventHandler> listeners;
if (eventListeners.TryGetValue(type, out listeners))
{
foreach (var listener in listeners)
{
listener(args);
}
}
}
}
我们只需要在界面的显示逻辑里添加相应的事件监听,在销户逻辑里添加移除监听。当数据源发生变化时调用Dispatch来通知即可实现实时动态刷新。这点很类似设计模式中的观察者模式。