C#事件模型的一個(gè)實(shí)例
在.net設(shè)計(jì)開發(fā)過(guò)程中事件無(wú)疑是用的最多的,下面設(shè)計(jì)幾個(gè)類來(lái)理解CLR事件工作機(jī)制:
C#事件模型應(yīng)用場(chǎng)景:假設(shè)我設(shè)計(jì)一個(gè)送貨上門的服務(wù)程序,當(dāng)要送貨時(shí)我將消息發(fā)送給送奶工或者郵遞員等。
在構(gòu)建應(yīng)用程序時(shí),我們先設(shè)計(jì)一個(gè)名為GoodsManager的類型負(fù)責(zé)發(fā)送消息,為GoodsManager類型定義一個(gè)對(duì)外提供名為NewGoods的事件。其它類型如"Milk"、“NewsPaper”可以訂閱該事件。當(dāng)GoodsManager接收到新的消息時(shí),他將引發(fā)該事件,將消息分發(fā)給已訂閱事件的對(duì)象。各個(gè)對(duì)象則以自己期望的方式來(lái)處理消息。
- 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)濟(jì)危機(jī)了取消Milk訂閱
- milk.UnRegister(gm);
- gm.SubmitGoods("lily", "Peter", "送貨上門");
- Console.ReadLine();
- }
- /// < summary>
- /// 定義一個(gè)類型用于存放發(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;
- //增加一個(gè)事件成員
- public event EventHandler< NewGoodsEventArgs> NewGoods
- {
- //加私有鎖并向委托鏈表增加一個(gè)處理程序
- add { lock (m_eventLock) { m_NewGoods += value; } }
- //顯示實(shí)現(xiàn)Remove方法
- remove { lock (m_eventLock) { m_NewGoods -= value; } }
- }
- //引發(fā)事件的方法,以通知訂閱者對(duì)像事件已發(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)個(gè)對(duì)象用來(lái)通知接受者信息
- 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);
- }
- //當(dāng)新的物品送到時(shí)執(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#事件模型的例子就介紹到這里。
【編輯推薦】
- C# winForm自定義鼠標(biāo)樣式的兩種方法
- C#自定義消息框的設(shè)置圖解
- 掌握C#自定義泛型類:從初始化說(shuō)起
- C#存儲(chǔ)過(guò)程的循序漸進(jìn)
- 存儲(chǔ)過(guò)程的優(yōu)勢(shì)及其調(diào)用方法介紹