一、作用
让多个观察者监视某一对象的变化,如果对象变化,则通知所有观察者。
二、例子
///
/// 抽象主题类
///
public abstract class Subject
{
private IList
observers = new List
();
///
/// 增加观察者
///
///
public void Attach(Observer observer)
{
observers.Add(observer);
}
///
/// 移除观察者
///
///
public void Detach(Observer observer)
{
observers.Remove(observer);
}
///
/// 向观察者(们)发出通知
///
public void Notify()
{
foreach (Observer o in observers)
{
o.Update();
}
}
}
///
/// 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己
///
public abstract class Observer
{
public abstract void Update();
}
///
/// 具体观察者或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
///
public class ConcreteSubject : Subject
{
private string subjectState;
///
/// 具体观察者的状态
///
public string SubjectState
{
get { return subjectState; }
set { subjectState = value; }
}
}
///
/// 具体观察者,实现抽象观察者角色所要求的更新接口,已是本身状态与主题状态相协调
///
public class ConcreteObserver : Observer
{
private string observerState;
private string name;
private ConcreteSubject subject;
///
/// 具体观察者用一个具体主题来实现
///
public ConcreteSubject Subject
{
get { return subject; }
set { subject = value; }
}
public ConcreteObserver(ConcreteSubject subject, string name)
{
this.subject = subject;
this.name = name;
}
///
/// 实现抽象观察者中的更新操作
///
public override void Update()
{
observerState = subject.SubjectState;
Console.WriteLine("The observer's state of {0} is {1}", name, observerState);
}
}