观察者模式面向的需求是:
A对象(观察者)对B对象(被观察者)的某种变化高度敏感,需要在B变化的一瞬间做出反应,但是我们又不能时时刻刻盯着B,所以采取是注册+订阅的方式,被观察者通知观察者我发生了改变。观察者模式是一种对象行为型模式,其主要优点如下。
降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。目标与观察者之间建立了一套触发机制。它的主要缺点如下。
目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。观察者模式的主要角色如下。
抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。贴上代码:
at temperature; public float Temperature { get { return temperature; } set { temperature = value; } } private float humidity; public float Humidity { get { return humidity; } set { humidity = value; } } private float pressure; public float Pressure { get { return pressure; } set { pressure = value; } } private float[] futureTemperature; public float[] FutureTemperature { get { return futureTemperature; } set { futureTemperature = value; } } public WeatherData() { observers = new List<IObserver>(); } public void AddObserver(IObserver observer) { observers.Add(observer); } public void NotifyObserver() { foreach (IObserver obj in observers) { obj.Update(); } } public void RemoveObserver(IObserver observer) { observers.Remove(observer); } public void SetData(float temperature,float humidity,float pressure,float[] futureTemperature = null) { this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; this.futureTemperature = futureTemperature; NotifyObserver(); } } public class TodayWeatherDisplay : IObserver, IDisplayElement { private WeatherData weatherData; private float temperature; private float humidity; private float pressure; public TodayWeatherDisplay(WeatherData weatherData) { this.weatherData = weatherData; weatherData.AddObserver(this); } public void Display() { Console.WriteLine("当前温度为:" + this.temperature); Console.WriteLine("当前湿度为:" + this.humidity); Console.WriteLine("当前气压为:" + this.pressure); } public void Update() { this.temperature = weatherData.Temperature; this.humidity = weatherData.Humidity; this.pressure = weatherData.Pressure; Display(); } } //Observer观察者模式 //这里使用的是一个天气预报的例子 //WeatherData类保存了天气的数据,它属于一个被观察者 //TodayWeatherDisplay用来模拟显示屏显示的是今天的天气,属于一个观察者 //该设计模式就是观察者观察被观察者,当被观察者发生改变的时候需要作出相应的操作 WeatherData weatherData = new WeatherData(); TodayWeatherDisplay todayWeatherDisplay = new TodayWeatherDisplay(weatherData); weatherData.SetData(20f, 5f, 30f);