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

推荐订阅源

Y
Y Combinator Blog
IT之家
IT之家
博客园_首页
人人都是产品经理
人人都是产品经理
博客园 - Franky
I
InfoQ
Recent Announcements
Recent Announcements
P
Proofpoint News Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
Microsoft Security Blog
Microsoft Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
MongoDB | Blog
MongoDB | Blog
雷峰网
雷峰网
博客园 - 聂微东
N
Netflix TechBlog - Medium
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
D
Docker

博客园 - 周银辉

[转]用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);
            }
        }
    }
}