惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
D
DataBreaches.Net
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
腾讯CDC
博客园_首页
The Cloudflare Blog
S
SegmentFault 最新的问题
C
Check Point Blog
美团技术团队
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale

博客园 - 周银辉

[转]用Whois获得电信运营商的IP地址是如何分配的? 右键添加复制路径选项 nmap报错: Failed to open device ethxxx XML中输入特殊符号 windows forms 上一个类似于wpf snoop 的工具: Hawkeye 非常棒的Visual Studo调试插件:OzCode 为普通Object添加类似AttachedProperty的属性 WPF中监视DependencyProperty的变化 Swift之 ? 和 ! Swift中的willSet与didSet 快速掌握iOS API的一个小技巧 一份关于Swift语言学习资源的整理文件 xcode6 beta 中智能提示(自动完成)功能有时不显示的问题 开源项目导入eclipse的一般步骤 WPF Popup 控件导致被遮挡内容不刷新的原因 修改eclipse的自动完成功能 mac os 下搭建android开发环境 mac下打开FTP服务 Mac下打开eclipse 始终提示 你需要安装Java SE 6 Runtime
自定义的事件管理器
周银辉 · 2014-06-20 · via 博客园 - 周银辉

            自定义的事件管理器

              周银辉

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

    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);
            }
        }
    }
}