C#事件模型的一個實例
在.net設(shè)計開發(fā)過程中事件無疑是用的最多的,下面設(shè)計幾個類來理解CLR事件工作機制:
C#事件模型應(yīng)用場景:假設(shè)我設(shè)計一個送貨上門的服務(wù)程序,當要送貨時我將消息發(fā)送給送奶工或者郵遞員等。
在構(gòu)建應(yīng)用程序時,我們先設(shè)計一個名為GoodsManager的類型負責發(fā)送消息,為GoodsManager類型定義一個對外提供名為NewGoods的事件。其它類型如"Milk"、“NewsPaper”可以訂閱該事件。當GoodsManager接收到新的消息時,他將引發(fā)該事件,將消息分發(fā)給已訂閱事件的對象。各個對象則以自己期望的方式來處理消息。
- class Program
- {
- static void Main(string[] args)
- {
- GoodsManager gm = new GoodsManager();
- Milk milk = new Milk(gm);
- NewsPaper paper = new NewsPaper();
- paper.Register(gm);
- gm.SubmitGoods("Jacky","Lily","送貨上門");
- Console.WriteLine("**************");
- //發(fā)生經(jīng)濟危機了取消Milk訂閱
- milk.UnRegister(gm);
- gm.SubmitGoods("lily", "Peter", "送貨上門");
- Console.ReadLine();
- }
- /// < summary>
- /// 定義一個類型用于存放發(fā)送給事件接收者的附加信息
- /// < /summary>
- internal class NewGoodsEventArgs : EventArgs
- {
- private readonly String f_From, f_To, f_Desc;
- public NewGoodsEventArgs(String from,String to,String desc)
- {
- f_From = from;
- f_To = to;
- f_Desc = desc;
- }
- public String From { get { return f_From; } }
- public String To { get { return f_To; } }
- public String Desc { get { return f_Desc; } }
- }
- //定義事件成員管理類
- internal class GoodsManager
- {
- //創(chuàng)建線程同步鎖的私有字段
- private readonly Object m_eventLock = new Object();
- private EventHandler< NewGoodsEventArgs> m_NewGoods;
- //增加一個事件成員
- public event EventHandler< NewGoodsEventArgs> NewGoods
- {
- //加私有鎖并向委托鏈表增加一個處理程序
- add { lock (m_eventLock) { m_NewGoods += value; } }
- //顯示實現(xiàn)Remove方法
- remove { lock (m_eventLock) { m_NewGoods -= value; } }
- }
- //引發(fā)事件的方法,以通知訂閱者對像事件已發(fā)生。
- protected virtual void OnNewGoods(NewGoodsEventArgs e)
- {
- EventHandler< NewGoodsEventArgs> temp = m_NewGoods;
- if (temp != null)
- temp(this,e);
- }
- //將輸入轉(zhuǎn)化為期望事件
- public void SubmitGoods(String from, String to, String desc)
- {
- //構(gòu)個對象用來通知接受者信息
- NewGoodsEventArgs e = new NewGoodsEventArgs(from,to,desc);
- //調(diào)用虛方法通知事件已發(fā)生
- OnNewGoods(e);
- }
- }
- //監(jiān)聽事件的類型
- internal sealed class Milk
- {
- public Milk() { }
- public Milk(GoodsManager gm)
- {
- gm.NewGoods += new EventHandler< NewGoodsEventArgs>(Milk_NewGoods);
- }
- //當新的物品送到時執(zhí)行此方法
- void Milk_NewGoods(object sender, NewGoodsEventArgs e)
- {
- Console.WriteLine("Accept Milk");
- Console.WriteLine("From:{0},To:{1},desc:{2}",e.From,e.To,e.Desc);
- }
- public void UnRegister(GoodsManager gm)//注銷事件
- {
- gm.NewGoods -= Milk_NewGoods;
- }
- public void Register(GoodsManager gm) //訂閱事件
- {
- gm.NewGoods += Milk_NewGoods;
- }
- }
- internal sealed class NewsPaper
- {
- public NewsPaper() { }
- public NewsPaper(GoodsManager gm)
- {
- gm.NewGoods += new EventHandler< NewGoodsEventArgs>(Milk_NewGoods);
- }
- void Milk_NewGoods(object sender, NewGoodsEventArgs e)
- {
- Console.WriteLine("Accept News Paper");
- Console.WriteLine("From:{0},To:{1},desc:{2}", e.From, e.To, e.Desc);
- }
- public void UnRegister(GoodsManager gm)
- {
- gm.NewGoods -= Milk_NewGoods;
- }
- public void Register(GoodsManager gm)
- {
- gm.NewGoods += Milk_NewGoods;
- }
- }
- }
C#事件模型執(zhí)行結(jié)果:
C#事件模型的例子就介紹到這里。
【編輯推薦】