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

一,定义:
观察者模式又叫发布-订阅模式(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();
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值