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

一、场景:有一个气象站,检测气象后发布气象信息,有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

 

原文地址:https://www.cnblogs.com/zwt-blog/p/6431466.html