基于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 @   瞌睡的小牛  阅读(213)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示