【设计模式】观察者模式
1、概述
背景
天气监测站会有每天的气温、湿度、气压,并且当有数据更新时,会把它们推送给百度、新浪等网站。
定义
又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
结构
在观察者模式中有如下角色:
- Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
- ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
- Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
- ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
2、实现思路
天气监测站会有每天的气温、湿度、气压,并且当有数据更新时,会把它们推送给百度、新浪等网站。
我们首先看看不使用观察者模式的代码:
public class WeatherStation
{
private BaiduWeather _baiduWeather;
public WeatherStation(BaiduWeather baiduWeather)
{
this._baiduWeather = baiduWeather;
}
/// <summary>
/// 气温
/// </summary>
private double Temperature { get; set; }
/// <summary>
/// 湿度
/// </summary>
private double Humidity { get; set; }
/// <summary>
/// 气压
/// </summary>
private double Pressure { get; set; }
public double GetTemperature()
{
return this.Temperature;
}
pu