观察者模式

一、生活中的观察者模式

比如我们使用的微信订阅号,关注订阅号的就是观察者,在订阅号上发布信息的就是发布者(主题对象),还有微博、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();
        }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值