二、观察者模式(Observer Pattern)

1、观察者模式定义

     观察者模式定义了对象之间一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

2、类图

     ObserverPattern

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);
	}
}
posted @ 2011-05-06 10:56  Lonfee  阅读(382)  评论(0编辑  收藏  举报