基于C#委托事件的消息中心

消息中心

单例模式

在Gof23设计模式中,单例模式具有:1、只有一个实例 2、能够自我实例化 3、提供全局访问点的特点

class Singleton//单例模式,只能通过对象名+.调用方法
{
    private static Singleton instance;
    private static readonly Object obj = new Object();
    private Singleton(){}
    public static Singleton GetSingleton()
    {
        if(instance==null)
        {
            lock(obj)//避免多个线程同时访问,添加lock锁排队机制
            {
                if(instance==null)
                {
                    instance = new Singleton();
                }
            }
        }
        return instance;//返回当前对象的实例
    }
}
class Singleton<T>where T:class,new()//可继承的泛型单例
{
    private static T instance;
    private static readonly Object obj = new Object();
    //protected声明的方法可以在本类和子类中调用
    protected Singleton(){}
    public static T GetSingleton()
    {
        if(instance==null)
        {
            lock(obj)
            {
                if(instance==null)
                {
                    instance = new T();
                }
            }
        }
        return instance;
    }
}

观察者模式

何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新
在观察者模式的基础上,我们利用C#的委托事件机制,实现一个负责消息广播和储存侦听的中心,就是消息中心

消息中心模板代码

enum EventName{}
class MessageCenter : Singleton<MessageCenter>
{
    Dictionary<EventName, Delegate> dic = new Dictionary<EventName, Delegate>();
    /// <summary>
    /// 添加侦听的方法
    /// </summary>
    /// <param name="name"></param>
    /// <param name="act"></param>
    public void AddEventListener(EventName name, Action act)
    {
        if (dic.ContainsKey(name) == false)
        {
            dic.Add(name, act);
        }
        else
        {
            dic[name] = dic[name] as Action + act;
        }
    }
    /// <summary>
    /// 移除侦听的方法
    /// </summary>
    /// <param name="name"></param>
    /// <param name="act"></param>
    public void RemoveEventListener(EventName name, Action act)
    {
        if (dic.ContainsKey(name))
        {
            dic[name] = dic[name] as Action - act;
        }
    }
    /// <summary>
    /// 广播事件的方法
    /// </summary>
    /// <param name="name"></param>
    public void BroadCast(EventName name)
    {
        if (dic.ContainsKey(name))
        {
            Action act = dic[name] as Action;
            if (act != null)
            {
                act();
            }
        }
    }
}

添加重载

public void AddEventListener<T>(EventName name, Action<T> act)//具有一个泛型参数的添加侦听的方法
{
    if (dic.ContainsKey(name) == false)
    {
        dic.Add(name, act);
    }
    else
    {
        dic[name] = dic[name] as Action<T> + act;
    }
}
posted @ 2023-04-13 15:00  瞌睡的小牛  阅读(197)  评论(0编辑  收藏  举报