16. .Net 事件模式 【程序设计 : 猫叫一声,所有的老鼠都开始逃跑,主人被惊醒。 (C# 语言 )
要求: 1. 要有联动性,老鼠和主人的行为是被动的。 2. 考虑可扩展性,猫的叫声可能引起其他联动效应。】
解答:
//1 、定义一个类型用于保存所有需要发送给事件通知接受者的附加信息(继承于 System.EventArgs )
public class CryArgs : EventArgs
{
public readonly string Name;
public CryArgs(string name)
{
this .Name = name;
}
}
//2
、定义一个委托类型,用于指定事件触发时被调用的方法类型
public
delegate
void
SubEventHandler
(object
sender,CryArgs
cryArgs);
//3
、定义一个事件成员
public
class
Subject
{
public event SubEventHandler SubEvent;
protected virtual void FireAway(CryArgs cryArgs)
{
if (this .SubEvent != null )
this .SubEvent(this ,cryArgs);
}
}
public class Cat : Subject
{
private string name;
public Cat(string name)
{
this .name = name;
}
public void Cry()
{
CryArgs cryArgs = new CryArgs (name);
//Console.WriteLine("cat cryed.");
this .FireAway(cryArgs);
}
}
//4
、定义一个受保护的虚方法,负责通知事件的登记对象
public
abstract
class
Observer
{
public Observer(Subject sub)
{
sub.SubEvent += new SubEventHandler (Response);
}
public abstract void Response(object sender,CryArgs cryArgs);
}
//5
、定义一个方法,将输入转化为期望的事件
public
class
Mouse
: Observer
{
private string name;
public Mouse(string name, Subject sub) : base (sub)
{
this .name = name;
}
public override void Response(object sender, CryArgs cryArgs)
{
Console .WriteLine(cryArgs.Name+" 叫," +name + " attempt to escape!" );
}
}
public class Master : Observer
{
public Master(Subject sub) : base (sub){}
public override void Response(object sender, CryArgs cryArgs)
{
Console .WriteLine(cryArgs.Name + " 叫," + "host waken" );
}
}
// 注册事件
static void Main(string [] args)
{
Cat c = new Cat ("laomao" );
Mouse mouse = new Mouse ("haozi" , c);
Master master = new Master (c);
c.Cry();
}