一個男人與3個女人的故事[《.net框架程序設(shè)計》讀書筆記_第11章 多事件示例]
發(fā)表時間:2024-06-17 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]第十一章 多事件示例[一個男人和三個女人的故事]摘要: 應用FCL中的System.ComponentModel.EventHandlerList示例一個類型中發(fā)布多事件的應用 場景:一個男生有三個女朋友,各自有不同的愛好,女朋友A愛好音樂,女朋友B愛好美食,女朋友C愛好XXX,為滿足...
第十一章 多事件示例[一個男人和三個女人的故事]
摘要:
應用FCL中的System.ComponentModel.EventHandlerList示例一個類型中發(fā)布多事件的應用
場景:一個男生有三個女朋友,各自有不同的愛好,女朋友A愛好音樂,女朋友B愛好美食,女朋友C愛好XXX,為滿足各個女朋友,此男生必須進行唱歌、烹飪食物、xxx。
以此制作程序演示單類型多事件的應用,并假設(shè)此男同時只能干一件事情(即排除一邊xxx一邊唱歌或一邊xxx一邊烹飪的可能J)
如下為源代碼:
using System;
using System.ComponentModel;
//男朋友的源代碼
public class BoyFriend
{
protected EventHandlerList eventList
= new EventHandlerList();
//
//滿足女朋友A定義音樂喜好
//使用自定義的音樂事件及回調(diào)函數(shù)
protected static readonly object musicEventKey = new object();
public class MusicEventArgs : EventArgs
{
private string strMusicName;
public string MusicName
{
get{
return strMusicName;
}
}
public MusicEventArgs(string strMusicName)
{
this.strMusicName = strMusicName;
}
}
public delegate void MusicEventHandler(object sender, MusicEventArgs args);
public event MusicEventHandler MusicMsg
{
add
{
eventList.AddHandler(musicEventKey, value);
}
remove
{
eventList.RemoveHandler(musicEventKey, value);
}
}
protected virtual void OnMusic(MusicEventArgs e)
{
Delegate d = eventList[musicEventKey];
if(d != null)
{
d.DynamicInvoke(new Object[]{this, e});
}
}
public void SimulateMusic(string strName)
{
Console.WriteLine("男朋友:好的,我給你唱支{0}吧!", strName);
OnMusic(new MusicEventArgs(strName));
}
//
//滿足女朋友B的美食欲望
//
protected static readonly object cateEventKey = new object();
public class CateEventArgs : EventArgs
{
private string strCateName;
public string CateName
{
get
{
return strCateName;
}
}
public CateEventArgs(string strCateName)
{
this.strCateName = strCateName;
}
}
public delegate void CateEventHandler(Object sender, CateEventArgs args);
public event CateEventHandler CateMsg
{
add
{
eventList.AddHandler(cateEventKey, value);
}
remove
{
eventList.RemoveHandler(cateEventKey, value);
}
}
protected void OnCate(CateEventArgs e)
{
Delegate d = eventList[cateEventKey];
if(d != null)
{
d.DynamicInvoke(new Object[]{this, e});
}
}
public void SimulateCate(string strCateName)
{
Console.WriteLine("男朋友:請吃一點我做的{0}", strCateName);
OnCate(new CateEventArgs(strCateName));
}
//
//滿足女朋友C的xxx欲望
//使用EventArgs.Empty事件及System.EventHandler回調(diào)函數(shù)
protected static readonly object xxxEventKey = new object();
public event EventHandler XXXMsg
{
add
{
eventList.AddHandler(xxxEventKey, value);
}
remove
{
eventList.RemoveHandler(xxxEventKey, value);
}
}
protected virtual void OnXXX()
{
Delegate d = eventList[xxxEventKey];
if(d != null)
{
d.DynamicInvoke(new Object[]{this, EventArgs.Empty});
}
}
public void SimulateXXX()
{
Console.WriteLine("男朋友:你今天真漂亮呵!");
OnXXX();
}
public static void Main()
{
BoyFriend bf = new BoyFriend();
//
Console.WriteLine("上午 女朋友A來玩:");
GF_A gfa = new GF_A(bf);
bf.SimulateMusic("戀曲");
gfa.Unregister(bf);
//
Console.WriteLine();
Console.WriteLine("下午 女朋友B來玩");
GF_B gfb = new GF_B(bf);
bf.SimulateCate("祖?zhèn)餍√瘘c");
gfb.Unregister(bf);
//
Console.WriteLine();
Console.WriteLine("晚上 女朋友C來玩");
GF_C gfc = new GF_C(bf);
bf.SimulateXXX();
gfc.Unregister(bf);
}
}
//女朋友A的源代碼
public class GF_A
{
public GF_A(BoyFriend bf)
{
bf.MusicMsg += new BoyFriend.MusicEventHandler(MusicMsg);
Console.WriteLine("女朋友A:老公!我要聽歌");
}
private void MusicMsg(Object sender, BoyFriend.MusicEventArgs args)
{
switch(args.MusicName)
{
case "戀曲":
case "清歌":
Console.WriteLine("女朋友A:哇,是{0}耶,好喜歡啊!", args.MusicName);
break;
default:
Console.WriteLine("女朋友A:這首歌沒聽過耶,好好聽奧!");
break;
}
}
public void Unregister(BoyFriend bf)
{
BoyFriend.MusicEventHandler bfe = new BoyFriend.MusicEventHandler(MusicMsg);
bf.MusicMsg -= bfe;
Console.WriteLine("女朋友A: 休息了,別吵!");
}
}
//女朋友B的源代碼
public class GF_B
{
public GF_B(BoyFriend bf)
{
bf.CateMsg += new BoyFriend.CateEventHandler(CateMsg);
Console.WriteLine("女朋友B: 老公!我餓了!");
}
private void CateMsg(Object sender, BoyFriend.CateEventArgs args)
{
switch(args.CateName)
{
case "祖?zhèn)餍√瘘c":
Console.WriteLine("女朋友B: 哇!老公你真能干,{0}好好吃耶!", args.CateName);
break;
case "餅干":
case "方便面":
Console.WriteLine("女朋友B: 剛認識你時,給人家做小點心,現(xiàn)在讓人家吃方便食品了,555555");
break;
default:
Console.WriteLine("女朋友B: 這是什么東東,沒吃過耶");
break;
}
}
public void Unregister(BoyFriend bf)
{
BoyFriend.CateEventHandler e = new BoyFriend.CateEventHandler(CateMsg);
bf.CateMsg -= e;
Console.WriteLine("女朋友B: 吃飽了,謝謝你噢!");
}
}
//女朋友C的源代碼
public class GF_C
{
public GF_C(BoyFriend bf)
{
bf.XXXMsg += new EventHandler(XXXMsg);
Console.WriteLine("女朋友C: 老公!你今天真帥哦!");
}
private void XXXMsg(Object sender, EventArgs args)
{
Console.WriteLine("女朋友C: R...O...O...M...");
}
public void Unregister(BoyFriend bf)
{
EventHandler e = new EventHandler(XXXMsg);
bf.XXXMsg -= e;
Console.WriteLine("女朋友C:累了,想休息了!");
}
}
/*運行結(jié)果:
上午 女朋友A來玩:
女朋友A:老公!我要聽歌
男朋友:好的,我給你唱支戀曲吧!
女朋友A:哇,是戀曲耶,好喜歡啊!
女朋友A: 休息了,別吵!
下午 女朋友B來玩
女朋友B: 老公!我餓了!
男朋友:請吃一點我做的祖?zhèn)餍√瘘c
女朋友B: 哇!老公你真能干,祖?zhèn)餍√瘘c好好吃耶!
女朋友B: 吃飽了,謝謝你噢!
晚上 女朋友C來玩
女朋友C: 老公!你今天真帥哦!
男朋友:你今天真漂亮呵!
女朋友C: R...O...O...M...
女朋友C:累了,想休息了!
*/
注:1、因上例使用FCL中的System.ComponentModel.EventHandlerList,因此不具備線程安全性。
2、上述代碼中xxx部分未定義事件參數(shù)而是使用System.EventArgs.Emtpy,也沒有定義回調(diào)函數(shù)而是使用System.EventHandler;其他兩個事件都是自定義的。可以修改其他兩個事件
3、關(guān)于發(fā)布事件、自定義事件、多事件定義的詳細信息,請參考《.net框架程序設(shè)計》讀書筆記_第十一章 事件