1、首先定义两个接口,一个用于观察者(Observer),一个用于被观察者(Subject)
public interface ISubject
{
void RegisterObserver(IObserverObj o);
void RemoveObserver(IObserverObj o);
void NotifyableObserver();
}
public interface IObserverObj
{
void Update(double temp, double humidity, double pressure);
}
2、观察者和被观察者分别实现这两个接口
public class ObserverUser:IObserverObj
{
private double _temp;
private double _humidity;
private double _pressure;
public void Update(double temp, double humidity, double pressure)
{
_temp = temp;
_humidity = humidity;
_pressure = pressure;
Console.WriteLine(string.Join("\t", temp.ToString(), humidity.ToString(), pressure.ToString()));
}
}
public class WeatherData : ISubject
{
private double _temp;
private double _humidity;
private double _pressure;
private IList<IObserverObj> _observerList;
public WeatherData()
{
_observerList = new List<IObserverObj>();
}
public void RegisterObserver(IObserverObj o)
{
_observerList.Add(o);
}
public void RemoveObserver(IObserverObj o)
{
_observerList.Remove(o);
}
public void NotifyableObserver()
{
foreach (var observer in _observerList)
{
observer.Update(_temp, _humidity, _pressure);
}
}
public void SetWeatherData(double temp, double humidity, double pressure)
{
_temp = temp;
_humidity = temp;
_pressure = pressure;
NotifyableObserver();
}
}
这里写了两个类,一个是气象台,它是Subject,用于被别人观察;一个是观察者ObserverUser,它观察这个Subject。当当Subject的数据改变的时候就通知所有观察他的对象。怎么观察他呢?就是通过注册的方式,注册了就说明观察他了,然后当Subject的数据改变的时候就会通知到它;如果不想观察了就取消注册,到时候自然就不会通知它了。
3、最后模拟一下当注册、取消注册、通知观察者的代码:
static void Main(string[] args)
{
var oberver1 = new ObserverUser();
var oberver2 = new ObserverUser();
var oberver3 = new ObserverUser();
var subj = new WeatherData();
subj.RegisterObserver(oberver1);
subj.RegisterObserver(oberver2);
subj.RegisterObserver(oberver3);
subj.SetWeatherData(12.15, 24.5, 33.45);
subj.RemoveObserver(oberver3);
subj.SetWeatherData(0, 0.85, 33.45);
Console.ReadLine();
}
观察者模式的思想就是这样子的。此外,可以在构造Observer对象的时候,传入一个Subject对象的引用,到时候就可以直接到Observer对象中就可以取值注册。