基于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;
}
}