二、观察者模式(Observer Pattern)
1、观察者模式定义
观察者模式定义了对象之间一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
2、类图
3、例
public interface ISubject { void RegisterObserver(IObserver o); void RemoveObserver(IObserver o); void NotifyObservers(); } public interface IObserver { void Update(float temp); } public interface IDisplayElement() { void Display(); } public class Weather : ISubject { private ArrayList observers; private float temp; public Weather() { observers = new ArrayList(); } public void RegisterObserver(IObserver o) { observers.Add(o); } public void RemoveObserver(IObserver o) { int i = observers.IndexOf(o); if(i >= 0) { observers.Remove(i); } } public void NotifyObservers() { for(int i = 0;i < observers.count;i++) { IObserver observer = (IObserver)observers[i]; observer.Update(temp); } } public void MeasurementChanged() { NotifyObservers(); } public void SetMeasurements(float temp) { this.temp = temp; MeasurementChanged(); } } public class Displayer : IObserver,IDisplayElement { private float temp; private ISubject weatherData; public Displayer(ISubject weatherData) { this.weatherData = weatherData; weatherData.RegisterObserver(this); } public void Update(float temp) { this.temp = temp; Display(); } public void Display() { Console.WriteLine(temp); } }
在C#中可使用事件或委托从而可省去ObserversList,当事件发生时,自动调用Observer的Update方法更新状态。
public class Weather : ISubject { private float temp; public delegate void StateChangedEventHandler(float temp); public event StateChangedEventHandler StateChanged; public void SetMeasurements(float temp) { this.temp = temp; if(StateChanged != null) { StateChanged(temp); } } } public class Displayer : IObserver,DisplayElement { private float temp; public void Update(float temp) { this.temp = temp; Display(); } public void Display() { Console.WriteLine(temp); } } public class WeatherStation { public static void main(string[] args) { Weather weather = new Weather(); IObserver displayer = new Displayer(); weather.StateChange += displayer.Update; weather. SetMeasurements(100); } }