二、观察者模式(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);
}
}


浙公网安备 33010602011771号