游戏开发组件——delegate事件监听

在实际的开发过程中经常遇到这样一个问题:游戏的很多个界面同时开着的,这些界面又共享一部分数据信息,需要实时的动态的刷新这些数据信息。
设计思路:
构造全局的事件监听器,在每个界面打开时做好相应数据的监听事件,当数据发生改变时只需要派发相应的事件即可。

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来通知即可实现实时动态刷新。这点很类似设计模式中的观察者模式。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值