观察者设计模式(C#委托和事件的使用)

来源:互联网 发布:nba2k12手游需要网络吗 编辑:程序博客网 时间:2024/05/17 04:46

观察者模式是一个老生常谈的问题,但是在实际开发中还是很有用。在观察者设计模式中,有一个被观察者,若干个观察者。当被观察者发生某个动作时,注册到被观察者身上的观察者作出自身的响应(调用观察者的方法)。在被观察者身上,往往通过一个具有特殊签名的委托,即事件。
以下三个类,一个为调用类,一个为被观察者(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();        }    }}

总结:猫为被观察者,老鼠为观察者。猫类里面有一个委托,和利用该委托定义的事件。每个老鼠的一个行为(方法)注册到了猫的身上,当猫发生某个
行为时,触发了注册到猫身上的老鼠的一个方法(行为)。
注意:猫(被观察者)有一个委托,和一个事件,并且有一个触发整个方法链的一个初始方法,在该方法内调用事件(包装了观察者(老鼠)的行为)。整个行为链为:猫发出某个动作,老鼠相应的动作接着发生。
老鼠类里里面有一个方法,这个方法必须注册到猫的事件里,在猫的初始方法里调用这个事件,即是调用老鼠的方法。
至于事件的注册:可以在猫类里面注册,前提是必须将老鼠对象传递过来。也可以在老鼠类里面注册事件,这种情况可以使用单例模式。

这里写图片描述