设计者模式--观察者模式

来源:互联网 发布:淘宝模特红人余潇潇 编辑:程序博客网 时间:2024/09/21 09:17
一,定义:
观察者模式又叫发布-订阅模式(Publish/Subscribe)
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主体对象在状态发生变化时,会通知所有的观察者对象,是他们能够自动更新自己
观察者模式一般会牵扯至少两个角色Subject或Publish,叫做具体主题或通知者,将所有有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知
observer或subscribe类,具体观察者.

二:作用:
观察者模式所做的工作其实就是在解耦合.让耦合的双方都依赖于抽象,而不是依赖具体.从而使得各自的变化都不会影响另一边的变化

三,例子:
1,使用接口
interface Subject    {        void Notify();        string SubjectState { get; set; }    }    delegate void PatrolHander();    class Teacher : Subject    {        public event PatrolHander UpdateEvent;        public string SubjectState        { get; set; }        public void Notify()        {            if (UpdateEvent != null)            {                UpdateEvent();            }        }    }    class Student    {        private string name;        private Subject sub;        public Student(string name, Subject sub)        {            this.name = name;            this.sub = sub;        }        public void Study()        {            Console.WriteLine("{0},{1}开始学习", sub.SubjectState, name);        }    } class Client    {        static void Main(string[] args)        {            Teacher t = new Teacher();            Student s = new Student("ad", t);            t.SubjectState = "老师来了";            t.UpdateEvent += s.Study;            t.Notify();            Console.ReadKey();        }    }

2,类似1,才有中间加类,隔离.
例子(猫捉老鼠):
class Cat    {        //委托        public delegate void CatShout(object sender,CatShoutEventArgs args);        //基于委托定义事件        public event CatShout CatShoutEvent;        public string name;        public Cat(string name){            this.name = name;        }        public void Shout()        {            Console.WriteLine("喵,我是{0}", this.name);            //说明该事件有人订阅            if (CatShoutEvent != null)            {                CatShoutEventArgs arg = new CatShoutEventArgs();                arg.Name = this.name;                CatShoutEvent(this,arg);            }        }    } class Mouse    {        private string name;        public Mouse(string name)        {            this.name = name;        }        public void Run(object sender,CatShoutEventArgs arg)        {            Console.WriteLine("{0}来了,{1}快跑",arg.Name, this.name);        }    }   class CatShoutEventArgs:EventArgs    {        private string name;        public string Name        {            set { name = value; }            get { return name; }        }    }         class Program    {        static void CatWithMouse()        {            Cat tom = new Cat("Tom");            Cat jim = new Cat("Jim");            //老鼠            Mouse jerry = new Mouse("Jerry");            Mouse jack = new Mouse("jack");            //订阅事件            tom.CatShoutEvent += jerry.Run;            jim.CatShoutEvent += jack.Run;            //tom来了            tom.Shout();            //jim来了            jim.Shout();        }        static void Main(string[] args)        {                        Program.CatWithMouse();            Console.ReadKey();        }    }