//程序设计 : 猫叫一声,所有的老鼠都开始逃跑,主人被惊醒。
//要求: 1. 要有联动性,老鼠和主人的行为是被动的。 2. 考虑可扩展性,猫的叫声可能引起其他联动效应。
//加注释序号部分为创建和使用事件的语言结构描述的步骤
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CatMouseAndMaster
{
//1.为事件定义一个代理
//定义一个委托类型,用于指定事件触发时被调用的方法类型
public delegate void SubEventHandler(object sender,CryArgs cryArgs);
//2.创建一个包含事件信息的类
//定义一个类型用于保存所有需要发送给事件通知接受者的附加信息(继承与System.EventArgs)
public class CryArgs : EventArgs
{
public readonly string Name;
public CryArgs(string name)
{
this.Name = name;
}
}
//3.创建包含事件成员的类
//定义一个事件成员
public class Subject
{
//(1)定义事件成员
public event SubEventHandler SubEvent;
//(2)创建触发事件的方法
protected virtual void FireAway(CryArgs cryAgrs)
{
if (SubEvent != null)
{
//通过事件成员SubEvent调用事件代理,并由代理调用注册的处理事件的方法
this.SubEvent(this, cryAgrs);
}
}
}
public class Cat : Subject
{
private string name;
public Cat(string name)
{
this.name = name;
}
public void Cry()
{
//创建CryArgs类的对象
CryArgs cryArgs = new CryArgs(name);
this.FireAway(cryArgs);
}
}
//4.创建事件处理方法
//定义一个受保护的虚方法,负责通知事件的登记对象
public abstract class Observer
{
public Observer(Subject sub)
{
//5.将事件处理方法和事件关联起来
sub.SubEvent += new SubEventHandler(Response);
}
public abstract void Response(object sender, CryArgs cryArgs);
}
//定义一个方法,将输入转化为期望的事件
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 + "开始逃跑");
}
}
public class Master : Observer
{
public Master(Subject sub)
: base(sub)
{
}
public override void Response(object sender, CryArgs cryArgs)
{
Console.WriteLine(cryArgs.Name + "叫,主人醒了");
}
}
class Program
{
//6.组成完整的创建事件和使用事件的程序
static void Main(string[] args)
{
Cat c = new Cat("猫");
Mouse mouse = new Mouse("老鼠",c);
Master master = new Master(c);
c.Cry();
}
}
}
转载于:https://blog.51cto.com/jwduan/490487