拿猫和老鼠的案例来说,代码如下:
1 定义猫类:
class Cat
{
private string name; private string color;
public Cat(string name,string color)
{
this.name = name; this.color = color;
}
public Action CatDelegate; //定义委托
//模拟猫状态发生改变
public void CatComing()
{
Console.WriteLine(color+"的猫"+name+"过来了");
if (CatDelegate!=null)
{
CatDelegate();
}
}
//每当观察者做修改,都在被观察者里有变化,增大了代码的耦合性 摒弃
public void CatComingTwo(Mouse mouse1,Mouse mouse2)
{
mouse1.Run();
mouse2.Run();
}
}
2 定义老鼠类:
class Mouse
{
private string name; private string color;
public Mouse(string name, string color)
{
this.name = name;
this.color = color;
}
public void Run()
{
Console.WriteLine(color+"的老鼠"+name+"跑了");
}
}
3
/// <summary>
/// 使用多播委托实现观察者模式
/// </summary>
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("Tom","蓝");
Mouse mouse1 = new Mouse("Jerry", "黄");
Mouse mouse2 = new Mouse("Petty", "黑");
//多播委托
cat.CatDelegate += mouse1.Run;//注册
cat.CatDelegate += mouse2.Run;
cat.CatComing();
Console.ReadKey();
//非委托方式实现,
cat.CatComingTwo(mouse1, mouse2);
}
}
由此可以看出,在不使用委托方式时,当我们增加了一个老鼠,需要在被观察者的代码里增加参数,修改被观察者的代码;而使用多播委托实现观察者模式,被观察者代码无需改变,当观察者做改变,只需要在委托里注册一下即可