一個男人和三個女人的故事[《.net框架程序設計》讀書筆記_第十一章 多事件示例]
2024-07-10 13:03:24
供稿:網友
網站運營seo文章大全提供全面的站長運營經驗及seo技術!第十一章 多事件示例[一個男人和三個女人的故事]
摘要:
應用fcl中的system.componentmodel.eventhandlerlist示例一個類型中發布多事件的應用
場景:一個男生有三個女朋友,各自有不同的愛好,女朋友a愛好音樂,女朋友b愛好美食,女朋友c愛好xxx,為滿足各個女朋友,此男生必須進行唱歌、烹飪食物、xxx。
以此制作程序演示單類型多事件的應用,并假設此男同時只能干一件事情(即排除一邊xxx一邊唱歌或一邊xxx一邊烹飪的可能j)
如下為源代碼:
using system;
using system.componentmodel;
//男朋友的源代碼
public class boyfriend
{
protected eventhandlerlist eventlist
= new eventhandlerlist();
//
//滿足女朋友a定義音樂喜好
//使用自定義的音樂事件及回調函數
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回調函數
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("祖傳小甜點");
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 "祖傳小甜點":
console.writeline("女朋友b: 哇!老公你真能干,{0}好好吃耶!", args.catename);
break;
case "餅干":
case "方便面":
console.writeline("女朋友b: 剛認識你時,給人家做小點心,現在讓人家吃方便食品了,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:累了,想休息了!");
}
}
/*運行結果:
上午 女朋友a來玩:
女朋友a:老公!我要聽歌
男朋友:好的,我給你唱支戀曲吧!
女朋友a:哇,是戀曲耶,好喜歡啊!
女朋友a: 休息了,別吵!
下午 女朋友b來玩
女朋友b: 老公!我餓了!
男朋友:請吃一點我做的祖傳小甜點
女朋友b: 哇!老公你真能干,祖傳小甜點好好吃耶!
女朋友b: 吃飽了,謝謝你噢!
晚上 女朋友c來玩
女朋友c: 老公!你今天真帥哦!
男朋友:你今天真漂亮呵!
女朋友c: r...o...o...m...
女朋友c:累了,想休息了!
*/
注:1、因上例使用fcl中的system.componentmodel.eventhandlerlist,因此不具備線程安全性。
2、上述代碼中xxx部分未定義事件參數而是使用system.eventargs.emtpy,也沒有定義回調函數而是使用system.eventhandler;其他兩個事件都是自定義的。可以修改其他兩個事件
3、關于發布事件、自定義事件、多事件定義的詳細信息,請參考《.net框架程序設計》讀書筆記_第十一章 事件