温习下设计模式之观察者模式:本文参考来源:HeadFirst设计模式
题外话:HeadFirst真是深入浅出,就像看连环画,对于不爱看枯燥的文字的我非常合适,入门或快速记忆学习非常大的帮助,用此书中一个场景来说:让你犹如碰见一只饥饿的老虎,强烈刺激你的大脑皮层,让你印象深刻。
观察者模式的“教科书”(上图书中)定义:
在对象之间定义一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
UML类图如下:
观察者模式提供了一种设计,让主题和观察者之间松耦合。当两个对象之间松耦合,他们依然可以交互,但是不清楚彼此的细节。观察者模式提出了一个设计原则:为了交互对象之间的松耦合设计而努力。
C# 代码实例:
public interface IObserver
{
void Update(float temperature, float humidity, float pressure);
}
public interface ISubject
{
void RegisterSubject(IObserver observer);
void RemoveSubject(IObserver observer);
void NotifySubject();
}
public class WeatherData : ISubject
{
private List<IObserver> observers = new List<IObserver>();
private float temperature;
private float humidity;
private float pressure;
public void NotifySubject()
{
foreach (var observer in observers)
{
observer.Update(temperature,humidity,pressure);
}
}
public void RegisterSubject(IObserver observer)
{
observers.Add(observer);
}
public void RemoveSubject(IObserver observer)
{
observers.Remove(observer);
}
public void MeasurementsChanged()
{
NotifySubject();
}
public void SetMeasurements(float temperature, float humidity, float pressure)
{
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
MeasurementsChanged();
}
}
两个具体的观察者:
public class CurrentWeatherReportor : IObserver
{
public CurrentWeatherReportor(ISubject subject)
{
subject.RegisterSubject(this);
}
public void Update(float temperature, float humidity, float pressure)
{
Console.WriteLine("[当前天气播报]>>: 气温:{0},湿度:{1}%,气压:{2}",temperature,humidity,pressure);
}
}
public class WeatherForecast : IObserver
{
public WeatherForecast(ISubject subject)
{
subject.RegisterSubject(this);
}
public void Update(float temperature, float humidity, float pressure)
{
Console.WriteLine("未来天气预报: 气温:{0}", temperature + 2);
}
}
测试:
static void Main(string[] args)
{
WeatherData weather = new WeatherData();
CurrentWeatherReportor cwr = new CurrentWeatherReportor(weather);
WeatherForecast wf = new WeatherForecast(weather);
weather.SetMeasurements(23, 20, 100);
Console.ReadLine();
}