自定义的事件管理器

            自定义的事件管理器

              周银辉

大多数框架下都提供了事件管理器的,但不使用框架时为了让事件发送者和事件接收者之间解耦,就可以如下写个简单的

    public enum EventAdministratorEventTypes
    {
        ApplicationStartup, //在这里添加你需要的事件
    }

    public class EventAdministratorEventArgs : EventArgs
    {
        public object Arg
        {
            get;
            protected set;
        }

        public EventAdministratorEventArgs(object arg)
        {
            Arg = arg;
        }
    }

    public class EventAdministrator
    {
        private static EventAdministrator instance;

        public static EventAdministrator Instance
        {
            get { return instance ?? (instance = new EventAdministrator()); }
        }

        /// <summary>
        /// 用于存储event和它对于的回调函数列表的字典(event 和 callback是一对多的关系)
        /// </summary>
        private readonly Dictionary<EventAdministratorEventTypes, List<EventHandler<EventAdministratorEventArgs>>>
            eventAndCallbackBuffer =
            new Dictionary<EventAdministratorEventTypes, List<EventHandler<EventAdministratorEventArgs>>>();

        private void AddCallbackForEvent(EventAdministratorEventTypes eventName,
            EventHandler<EventAdministratorEventArgs> callback)
        {
            if (!eventAndCallbackBuffer.ContainsKey(eventName))
            {
                eventAndCallbackBuffer.Add(eventName, new List<EventHandler<EventAdministratorEventArgs>>());
            }

            var callbackList = eventAndCallbackBuffer[eventName];
            //添加时判定不存在为了防止多次注册后引起多次调用回调函数
            if (!callbackList.Contains(callback))
            {
                callbackList.Add(callback);
            }
        }

        /// <summary>
        /// 注册为事件接受者
        /// </summary>
        /// <param name="eventName">事件名称</param>
        /// <param name="callback">事件发生时的回调函数</param>
        public void Register(EventAdministratorEventTypes eventName, EventHandler<EventAdministratorEventArgs> callback)
        {
            AddCallbackForEvent(eventName, callback);

        }

        /// <summary>
        /// 触发一个事件
        /// </summary>
        /// <param name="sender">触发者</param>
        /// <param name="eventName">事件名称</param>
        /// <param name="args">触发该事件时所带的参数</param>
        public void Send(object sender, EventAdministratorEventTypes eventName, EventAdministratorEventArgs args)
        {
            if (!eventAndCallbackBuffer.ContainsKey(eventName))
            {
                Logger.Warning("EventAdministrator:事件"+eventName+"被触发,但没有任何对象注册该事件." +
                               " 导致这个情况的原因可能有:代码中没有调用相应的Register函数来注册该事件; 或者 事件的Send函数发生在Register之前");
                return;
            }

            var callbackList = eventAndCallbackBuffer[eventName];

            foreach (var callback in callbackList)
            {
                callback.Invoke(sender, args);
            }
        }
    }
}

自定义的事件管理器

时间: 2024-10-27 12:32:07

自定义的事件管理器的相关文章

cocos2d-js v3事件管理器

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

事件管理器

项目开发过程中经常会用到代理事件,为方便管理,避免代码混乱,需要一个总的事件管理器: using UnityEngine; using System.Collections; using System.Collections.Generic; using System; public class EventManager<T> { private static Dictionary<EventType,List<Action<T>>> eventDic =

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

[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

Python深入02 上下文管理器

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围.一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它的语法形式是with...as... 关闭文件 我们会进行这样的操作:打开文件,读写,关闭文件.程序员经常会忘记关闭文件.上下文管理器可以在不需要文件的时候,自动关闭文件. 下面我们看一

python上下文管理器ContextLib及with语句

http://blog.csdn.net/pipisorry/article/details/50444736 with语句 with语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍).with 语句适用于对资源进行访问的场合,确保不管使用过程

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

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