c# 委托 envent 工具类

来源:互联网 发布:电脑卡片制作软件 编辑:程序博客网 时间:2024/06/15 03:47

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ActionDemo
{
    public interface ISubscriber
    {
        System.Action<object[]> Handler
        {
            set;
        }
        void Unsubscribe();
    }

    public static class EventManager
    {
        static Dictionary<string, List<Subscriber>> ms_subscribers = new Dictionary<string, List<Subscriber>>();

        private class Subscriber : ISubscriber
        {
            string m_subscribeKey;
            System.Action<object[]> m_handler;

            public Subscriber(string key)
            {
                m_subscribeKey = key;
            }

            ~Subscriber()
            {
                if (string.IsNullOrEmpty(m_subscribeKey))
                    return;
                Unsubscribe();
            }


            public System.Action<object[]> Handler
            {
                set { m_handler = value; }
            }

            public void Notify(params object[] args)
            {
                if (m_handler != null)
                    m_handler(args);
            }

            public void Unsubscribe()
            {
                List<Subscriber> sublist = null;
                if (!ms_subscribers.TryGetValue(m_subscribeKey, out sublist))
                {
                    return;
                }
                sublist.Remove(this);
                if (sublist.Count == 0)
                {
                    ms_subscribers.Remove(m_subscribeKey);
                }
                m_subscribeKey = null;
            }
        }

        public static ISubscriber Subscribe(string name)
        {
            List<Subscriber> sublist = null;
            if (!ms_subscribers.TryGetValue(name, out sublist))
            {
                sublist = new List<Subscriber>();
                ms_subscribers.Add(name, sublist);
            }

            Subscriber sub = new Subscriber(name);
            sublist.Add(sub);
            return sub;
        }

        private static void Notify(string name, params object[] args)
        {
            List<Subscriber> sublist = null;
            if (!ms_subscribers.TryGetValue(name, out sublist))
            {
                return;
            }

            Subscriber[] subs = sublist.ToArray();
            foreach (var sub in subs)
            {
                if (!sublist.Contains(sub))
                    continue;
                sub.Notify(args);
            }
        }

        public abstract class Publisher
        {
            public abstract string Name
            {
                get;
            }

            protected void Notify(string name, params object[] args)
            {
                EventManager.Notify(Name + ":" + name, args);
            }
        }
    }
}

 

----------------------------------------------------------------------------出版商-----------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ActionDemo
{
    public class PlayerDataPublisher : EventManager.Publisher
    {
        public static string NAME = "PlayerData";
        public static string EVENT_WORTH_UPDATE = "WorthUpdate";
        public static string EVENT_PROPERTY_UPDATE = "PropertyUpdate";

        public override string Name
        {
            get { return NAME; }
        }

        public void NotifyWorthUpdate(string data)
        {
            base.Notify(EVENT_WORTH_UPDATE, data);
        }

        public void NotifyPropertyUpdate(string data)
        {
            base.Notify(EVENT_PROPERTY_UPDATE, data);
        }
    }

}

 

---------------------------------------------------------------------订阅者-----------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ActionDemo
{
    class Test
    {
        public Test()
        {
            RegisterInfoChange();
        }

        public void RegisterInfoChange()
        {
            _mInfoUpdate = EventManager.Subscribe(PlayerDataPublisher.NAME + ":" + PlayerDataPublisher.EVENT_WORTH_UPDATE);
            _mInfoUpdate.Handler = delegate(object[] args)
            {
                string str = (string)args[0];
                NotifyMe(str);
            };
        }

        public void NotifyMe(string str)
        {
            Console.WriteLine("我接到了通知。。。");
            Console.WriteLine(str);
        }

 


        public ISubscriber _mInfoUpdate;
    }
}

---------------------------------------------------------------main函数-------------------------------------------------------------------------------------

    class Program
    {
        static void Main(string[] args)
        {
            PlayerDataPublisher p = new PlayerDataPublisher();
            Test t = new Test();
           
            p.NotifyWorthUpdate("明天不上班");

        }
    }

0 0
原创粉丝点击