观察者模式是一个老生常谈的问题,但是在实际开发中还是很有用。在观察者设计模式中,有一个被观察者,若干个观察者。当被观察者发生某个动作时,注册到被观察者身上的观察者作出自身的响应(调用观察者的方法)。在被观察者身上,往往通过一个具有特殊签名的委托,即事件。
以下三个类,一个为调用类,一个为被观察者(Cat),一个为观察者(Mouse):
using System;
namespace 委托与事件的学习_观察者设计模式_
{
//被观察者
class Cat
{
private String _name;
private string _color;
delegate void MyDelegate();//自定义一个委托类型,该委托可以包装一个没有返回值和参数的方法
private event MyDelegate CatComeEventHandler;//利用委托声明定义一个事件。但是委托和事件并没有本质区别,只是事件不可以在定义它的类外部
//被访问。事件,具有特殊签名的委托。
public Cat(string name,string color,Mouse mouse)
{
this._name = name;
this._color = color;
this.CatComeEventHandler += mouse.MouseRun;//注册事件,将事件指向mouse.MouseRun方法
}
public void CatCome()
{
Console.WriteLine("名字为:"+_name+"的小猫叫了一声");
CatComeEventHandler();//利用事件调用被注册的方法。CatCome事件发生,被注册的事件也发生。这就是观察者模式。
}
}
}
using System;
namespace 委托与事件的学习_观察者设计模式_
{
//观察者
class Mouse
{
private String _name;
private String _color;
public Mouse(string name,string color)
{
_name = name;
_color = color;
}
public void MouseRun()
{
Console.WriteLine("名字为:"+_name+"的老鼠开始逃跑了");
}
}
}
using System;
namespace 委托与事件的学习_观察者设计模式_
{
//调用类
class Program
{
static void Main(string[] args)
{
Mouse mouse = new Mouse("米奇", "黄色");
Cat cat = new Cat("米奇", "黄色", mouse);
cat.CatCome();
Console.ReadKey();
}
}
}
总结:猫为被观察者,老鼠为观察者。猫类里面有一个委托,和利用该委托定义的事件。每个老鼠的一个行为(方法)注册到了猫的身上,当猫发生某个
行为时,触发了注册到猫身上的老鼠的一个方法(行为)。
注意:猫(被观察者)有一个委托,和一个事件,并且有一个触发整个方法链的一个初始方法,在该方法内调用事件(包装了观察者(老鼠)的行为)。整个行为链为:猫发出某个动作,老鼠相应的动作接着发生。
老鼠类里里面有一个方法,这个方法必须注册到猫的事件里,在猫的初始方法里调用这个事件,即是调用老鼠的方法。
至于事件的注册:可以在猫类里面注册,前提是必须将老鼠对象传递过来。也可以在老鼠类里面注册事件,这种情况可以使用单例模式。