观察者模式

来源:互联网 发布:淘宝上可以买彩票吗 编辑:程序博客网 时间:2024/06/03 19:26

一、生活中的观察者模式

比如我们使用的微信订阅号,关注订阅号的就是观察者,在订阅号上发布信息的就是发布者(主题对象),还有微博、qq关注好友等这些都是观察者模式的应用,只要主题对象发生了变化,观察者就会得知变化。

二、观察者模式

1、观察者模式定义

在生活中,只要有关注了订阅号客户端,如果订阅号有什么更新,就是直接推送给订阅了的用户;

观察者模式是一种一对多的依赖关系,一个主题对象被多个观察者对象同时监听,主题对象的状态发生变化时,会通知所有的观察者对象,使它们自动更新自己的行为。

2、观察者模式者的角色

  抽象主题:主要是把所有观察者需要的引用汇集在一起,每个主题都有多个观察者,抽象主题提供一个接口,可以增加和删除观察者对象

 具体主题:将具体主题的状态存入到具体的观察者对象,具体主题对象状态变更时,通知所有注册的观察者对象

 抽象观察者:为所有具体观察者定义一个接口,主题对象发出通知时更新具体观察者对象。

 具体观察者:主要实现抽象观察者的接口,以便主题对象发出通知时,本身能够更新状态,与主题对象协调一致。

3、关键点

(1)定义观察者和被观察者接口,有利于各自的扩展

(2)重要的被观察者(主题对象):定义观察者列表,以及观察者的添加和删除

                                                          定义通知观察者的方法,主题对象状态发生改变时通知观察者更新


4、代码

主题对象接口:

    /// <summary>    /// 发布者接口    /// </summary>    public interface ISubject    {        void AddObserver(IObserver observer); //添加观察者        void RemoveObserver(IObserver observer);//移除观察者        void Nodify();//通知观察者的方法    }

具体主题对象:

public class Subject : ISubject    {        //用于保存订阅者的列表        private List<IObserver> observers = new List<IObserver>();        public string Msg { get; set; }        public string Name { get; set; }        public Subject(string name, string Msg)        {            this.Name = name;            this.Msg = Msg;        }        public void AddObserver(ObserverDemo.IObserver observer)        {            observers.Add(observer);        }        public void RemoveObserver(ObserverDemo.IObserver observer)        {            observers.Remove(observer);        }        public void Nodify()        {            if (observers != null && observers.Count > 0)            {                //通知所有订阅者                foreach (IObserver observer in observers)                {                    if(observer!=null)                    observer.Update(this);                }            }        }    }

观察者接口:

/// <summary>    /// 订阅者接口    /// </summary>    public interface IObserver    {        void Update(Subject subject);    }

具体观察者:

 public class Observer : IObserver    {        private string Name;        public Observer(string name)        {            this.Name = name;        }        public void Update(Subject subject)        {            Console.WriteLine("用户:{0},【{1}】发来信息:{2}",Name,subject.Name,subject.Msg);        }    }


测试:

private void button1_Click(object sender, EventArgs e)        {            ISubject subject = new Subject("巴士公交","办卡9折优惠");            ISubject subject1 = new Subject("Linux学习","暑假班报名啦。。。。");            subject.AddObserver(new Observer("zhouyao"));            subject1.AddObserver(new Observer("zhouyao"));            subject.AddObserver(new Observer("小鱼"));            subject.Nodify();            subject1.Nodify();            Console.ReadKey();        }

观察者模式在生活中到处常见。

原创粉丝点击