• 观察者模式(发布--订阅模式)


    一、场景:有一个气象站,检测气象后发布气象信息,有3个观察者会接受气象的发布信息。

    二、普通的处理方式:

    三、观察者模式处理方式:

    OO原则:为交互对象之间的松耦合设计而努力。(这个是第四条,后续还有几条)

      松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。

    观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

      详细代码关系图与代码如下。

    /// <summary>
    /// 主题,规定发布者遵行的行为
    /// </summary>
    public interface ISubject
    {
        /// <summary>
        /// 注册
        /// </summary>
        /// <param name="observer">观察者</param>
        void Register(IObserver observer);
        /// <summary>
        /// 注销,退出
        /// </summary>
        /// <param name="observer">观察者</param>
        void Logout(IObserver observer);
        /// <summary>
        /// 通知
        /// </summary>
        /// <param name="info">消息内容</param>
        void Notify(object info);
    }
    /// <summary>
    /// 观察者,规定订阅者遵行的行为
    /// </summary>
    public interface IObserver
    {
        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="info">要更新的信息</param>
        void Update(object info);
    }
    /// <summary>
    /// 气象数据主题
    /// </summary>
    public class WeatherData : ISubject
    {
        private List<IObserver> observerList = new List<IObserver>();
        /// <summary>
        /// 数据变更状态
        /// </summary>
        public bool Status { get; private set; }
    
        public Scene Info { get; set; }
        public void Register(IObserver observer)
        {
            observerList.Add(observer);
        }
    
        public void Logout(IObserver observer)
        {
            observerList.Remove(observer);
        }
    
        public void Notify(object info)
        {
            if (!Status)
            {
                return;
            }
            foreach (IObserver observer in observerList)
            {
                observer.Update(info);
            }
            Status = false;
        }
    
        public void SetChanged()
        {
            Status = true;
            Notify(Info);
        }
    }
    /// <summary>
    /// 场景、环境
    /// </summary>
    public struct Scene
    {
        /// <summary>
        /// 温度
        /// </summary>
        public float Temperature { get; set; }
        /// <summary>
        /// 湿度
        /// </summary>
        public float Humidity { get; set; }
        /// <summary>
        /// 压力
        /// </summary>
        public float Pressure { get; set; }
    
        public override string ToString()
        {
            return string.Format("温度:{0},湿度:{1},压力:{2}", Temperature, Humidity, Pressure);
        }
    }
    public class Observer1 : IObserver
    {
        public Observer1(ISubject subject)
        {
            subject.Register(this);
        }
    
        public void Update(object info)
        {
            Console.WriteLine("我是1号观察者(张三),当前信息 {0}", info);
        }
    }
    public class Observer2 : IObserver
    {
        public Observer2(ISubject subject)
        {
            subject.Register(this);
        }
    
        public void Update(object info)
        {
            Console.WriteLine("我是2号观察者(李四),当前信息 {0}", info);
        }
    }
    public class Observer3 : IObserver
    {
        public Observer3(ISubject subject)
        {
            subject.Register(this);
        }
    
        public void Update(object info)
        {
            Console.WriteLine("我是3号观察者(王五),当前信息 {0}", info);
        }
    }
    //测试代码
    [Test]
    public void WeatherStation()
    {
        WeatherData weather = new WeatherData();
        Observer1 observer1 = new Observer1(weather);
        Observer2 observer2 = new Observer2(weather);
        Observer3 observer3 = new Observer3(weather);
        Scene scene = new Scene() { Humidity = 26f, Temperature = 33f, Pressure = 29.2f };
        weather.Info = scene;
        weather.SetChanged();
        scene.Temperature = 31.5f;
        scene.Humidity = 28.2f;
        weather.Info = scene;
        weather.SetChanged();
    }
    View Code

     

  • 相关阅读:
    Python实例 包机制
    Python实例 类和继承
    python实例 文件处理
    python实例 异常处理
    配置 Apache+php多端口多站点(转载)
    C#中Delegate和Event以及它们的区别(转载)
    LINQ to SQL更新数据库操作(转载)
    创业公司如何实施敏捷开发(转)
    利用ps橡皮擦工具快速抠图
    XP win2003系统 微软雅黑字体的使用方法
  • 原文地址:https://www.cnblogs.com/zwt-blog/p/6431466.html
Copyright © 2020-2023  润新知