事件管理器

项目开发过程中经常会用到代理事件,为方便管理,避免代码混乱,需要一个总的事件管理器:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class EventManager<T> {

    private static Dictionary<EventType,List<Action<T>>> eventDic = new Dictionary<EventType,List<Action<T>>>();

    /// <summary>
    /// 添加事件
    /// </summary>
    /// <param name="type"></param>
    /// <param name="act"></param>
    public static void AddEvent(EventType type, Action<T> act)
    {
        if (eventDic.ContainsKey(type))
        {
            if(!eventDic[type].Contains(act))
            {
                eventDic[type].Add(act);
            }
        }else
        {
            List<Action<T>> list = new List<Action<T>>();
            eventDic.Add(type, list);
            list.Add(act);
        }
    }

    /// <summary>
    /// 移除事件
    /// </summary>
    /// <param name="type"></param>
    public static void RemoveEvent(EventType type)
    {
        if (eventDic.ContainsKey(type))
        {
            eventDic.Remove(type);
        }
    }

    public static void RemoveEvent(EventType type, Action<T> act)
    {
        if (eventDic.ContainsKey(type))
        {
            if (eventDic[type].Contains(act))
            {
                eventDic[type].Remove(act);
            }
        }
    }

    /// <summary>
    /// 触发事件
    /// </summary>
    /// <param name="type"></param>
    /// <param name="data"></param>
    public static void TriggerEvent(EventType type , T data)
    {
        if (eventDic.ContainsKey(type))
        {
            List<Action<T>> list = eventDic[type];
            foreach (var callback in list)
            {
                callback(data);
            }
        }
    }
}

public enum EventType
{
    None = 0,
    Event1 = 1,
    Event2 = 2,
}
时间: 2024-10-12 16:51:23

事件管理器的相关文章

phalcon:model 事件与事件管理器

事件与事件管理器(Events and Events Manager)¶ Models allow you to implement events that will be thrown when performing an insert/update/delete. They help define business rules for a certain model. The following are the events supported by Phalcon\Mvc\Model an

storm事件管理器EventManager源码分析-event.clj

storm事件管理器定义在event.clj中,主要功能就是通过独立线程执行"事件处理函数".我们可以将"事件处理函数"添加到EventManager的阻塞队列中,EventManager的事件处理线程不断地从阻塞队列中获取"事件处理函数"并执行. EventManager协议 协议就是一组函数定义的集合,协议中函数的第一个参数必须为实现该协议的实例本身,类似于java中实例方法的第一个参数为this:协议类似于java中的接口. (defpro

自定义的事件管理器

自定义的事件管理器 周银辉 大多数框架下都提供了事件管理器的,但不使用框架时为了让事件发送者和事件接收者之间解耦,就可以如下写个简单的 public enum EventAdministratorEventTypes { ApplicationStartup, //在这里添加你需要的事件 } public class EventAdministratorEventArgs : EventArgs { public object Arg { get; protected set; } public

cocos2d-js v3事件管理器

总概: 1.时间监听器(cc.EventListener)封装用户的事件处理逻辑. 2.事件管理器(cc.eventManager)管理用户注册的事件监听器. 3.事件对象(cc.Event)包含事件相关信息的对象. 事件监听器包含以下几种类型: 1.触摸事件监听器(cc.EventListenerTouch) 2.键盘事件监听器(cc.EventListenerKeyboard) 3.加速计事件监听器(cc.EventListenerAcceleration) 4.鼠标事件监听器(cc.Eve

[cocos2dx笔记010]用于UI的事件管理器

cocos2dx有一个编辑器:cocostudio,目前来说,已经是比较好用了,只要加载导出的资源,就可以用上了.省去手动搭建面的麻烦.但是,很多需要事件的地方,操作比较麻烦,所以这里提供一个事件管理器来集中和简化管理事件.对于C++事件委托方面,我这里使用了是FastDelegate(注:一个牛人写的).下面是具体实现的代理,不多. /* UI触摸事件管理器. 原有cocos2dx带的触摸事件,每次监听要操作的步骤比较多,为此增加了一个事件管理器,来集中和简化管理 */ #ifndef _X_

Redis事件管理(二)

Redis的定时器是自己实现的,不是很复杂.说说具体的实现吧. 定时器的存储维护采用的是普通的单向链表结构,具体节点定义为: 1 /*时间定时器结构体*/ 2 typedef struct aeTimeEvent 3 { 4 long long id; /*定时器的编号*/ 5 long when_sec; /* seconds */ 6 long when_ms; /* milliseconds */ 7 aeTimeProc *timeProc;/*时间到达处理函数*/ 8 aeEventF

Win10电脑老是自动弹出“事件查看器”?教你一招关掉它!

有网友表示,电脑升级win10系统后,“事件查看器”老是自动弹出,关闭后过段时间又弹出,玩游戏时也会自己弹出,严重影响心情.今天我就教大家如何解决这个问题,快来看看吧! 1.首先,按WIN+R键打开运行窗口,输入services.msc 回车打开: 2.找到[Windows Event Log],双击它,将“启动类型”修改为[足球比分],然后点[停止],“确定”即可. 设置好后,“事件管理器”就不会再自动弹出啦~ 如果你也升级了win10系统,快去设置下吧!

Redis事件管理(一)

Redis统一的时间管理器,同时管理文件事件和定时器, 这个管理器的定义: #if defined(__APPLE__) #define HAVE_TASKINFO 1 #endif /* Test for backtrace() */ #if defined(__APPLE__) || (defined(__linux__) && defined(__GLIBC__)) #define HAVE_BACKTRACE 1 #endif /* Test for polling API */

JavaScript 事件管理

在设计JavaScript xxsdk的时候考虑到能让调用者参与到工作流程中来,开始用了回调函数.如下: this.foo = function(args,callbackFn) { //do something //then if callbackFn is a function callbackFn(); }; 或者在初始化的传入config. function SDK(config) { var configs = { onInit: function() { }, onFoo: func