C#委托与事件之----事件
- 对事件的理解:事件其实没什么不好理解的,声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已(别人说的),可以类比事件是委托的属性体现
- 观察者设计模式(猫鼠游戏):
①被观察者属于少数,观察者属于多数,例:一群老鼠密切关注一只猫的动向。
②被观察者类中声明事件并触发(猫的状态发生改变会导致老鼠群的骚动),因为事件不能在类外别触发(老鼠在猫的身上装了监听器)。
③观察者中注册定义在被观察者中的事件(老鼠类中注册猫类中声明的事件)。
实例代码展示:(来自于siki学院课程内容)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 观察者设计模式_猫鼠游戏
{
/// <summary>
/// 被观察者:猫类.
/// </summary>
class Cat
{
private string color;
private string name;
//定义一个事件,事件不能在类的外部触发,只能在类的内部进触发.
//事件可以在外部进行注册.
//事件只能使用"+=","-="来注册或者取消注册事件.
public event Action CatCome;//声明了一个public 的事件,表示发布了一个消息.
public Cat(string color, string name)
{
this.color = color;
this.name = name;
}
/// <summary>
/// 猫的状态发生改变(被观察者的状态发生改变)
/// 在实际的游戏设计当中就是“开始按钮”被点击,然后通知其他各个模块开始发挥自己的作用.
/// </summary>
public void CatComing()
{
Console.WriteLine(color + "的猫:" + name + "进屋了,,,");
if (CatCome != null)
CatCome();
}
}
/// <summary>
/// 被观察者:老鼠.
/// </summary>
class Mouse
{
private string color;
private string name;
public Mouse(string color, string name, Cat cat)
{
this.color = color;
this.name = name;
//订阅消息.
cat.CatCome += this.Run;//把自身的Run方法注册进猫类的委托之中.
}
/// <summary>
/// 逃跑方法.
/// </summary>
public void Run()
{
Console.WriteLine(color + "的" + name + "说猫来了,赶紧跑!!!");
}
}
class Program
{
static void Main(string[] args)
{
Cat cat1 = new Cat("黄色", "加菲");
//每创建一个老鼠的对象就会触发猫来了这个事件(调用老鼠的Run方法)
Mouse m1 = new Mouse("黑色", "米奇",cat1);
Mouse m2 = new Mouse("粉色", "花花",cat1);
Mouse m3 = new Mouse("灰色", "杰瑞", cat1);
cat1.CatComing();
Console.ReadKey();
}
}
/*
* (1)当观察者的数量少,且确认其数量不再改变的时候,可以使用在被观察者
* 的方法中添加观察者对象的方法.
*
* (2)当观察者的数量不确定,会随时增加或者减少观察者的数量的时候,考虑使用事件通知的方法.
* 具体思路:在catComing()里面调用委托,之后将所有观察者的方法都注册到该委托里面.
*/
}