应用场景:当一个对象的改变需要同时改变其他对象的时候。
定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态以发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
// 通知者接口,里面包含了观察者接口
interface Subject
{
void Attach(Observer observer);
void Detach(Observer observer);
void Notify();
string SubjectState { get;set;}
}
// 老板类,实现了通知者接口,是具体的通知者。类内部包含了观察者接口的引用
class Boss:Subject
{
// 同事列表
private IList<Observer> observers = new List<Observer>();
private string action;
// 加入要通知的观察者
public void Attach(Observer observer)
{
observers.Add(observer);
}
// 去除要通知的观察者
public void Detach(Observer observer)
{
observers.Remove(observer);
}
// 通知观察者,观察者执行Update方法
public void Notify()
{
foreach (Observer o in observers)
{
o.Update();
}
}
// 通知者的状态,此状态变化时,通知观察者
public string SubjectState
{
get
{
return action;
}
set
{
action = value;
}
}
}
// 前台秘书类 实现了通知者接口,是具体的通知者。类内部包含了观察者接口的引用
class Secretary:Subject
{
// 同事列表
private IList<Observer> observers = new List<Observer>();
private string action;
// 加入要通知的观察者
public void Attach(Observer observer)
{
observers.Add(observer);
}
// 去除要通知的观察者
public void Detach(Observer observer)
{
observers.Remove(observer);
}
// 通知观察者,观察者执行Update方法
public void Notify()
{
foreach (Observer o in observers)
{
o.Update();
}
}
// 通知者的状态,此状态变化时,通知观察者
public string SubjectState
{
get
{
return action;
}
set
{
action = value;
}
}
}
// 抽象观察者类,内部包含了通知者类的对象
abstract class Observer
{
protected string name;
protected Subject sub;
public Observer(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
public abstract void Update();
}
// 具体的股票观察者类,继承了观察者抽象类
class StockObserver:Observer
{
public StockObserver(string name, Subject sub)
: base(name, sub)
{
}
// 重写了Update方法
public override void Update()
{
Console.WriteLine("{0}{1} 关闭股票行情,继续工作!",sub.SubjectState,name);
}
}
// 具体的NBA观察者类
class NBAObserver:Observer
{
public NBAObserver(string name, Subject sub)
: base(name, sub)
{
}
public override void Update()
{
Console.WriteLine("{0}{1} 关闭NBA,继续工作!",sub.SubjectState,name);
}
}
// 客户端掉用代码
static void Main(string[] args)
{
// 老板胡汉三
Boss huhansan = new Boss();
// 看股票的同事,将通知者加入到观察者对象中去
StockObserver tongshi1 = new StockObserver("魏关姹",huhansan);
// 看NBA的同事
NBAObserver tongshi2 = new NBAObserver("易管查",huhansan);
// 通知者对象加入观察者对象
huhansan.Attach(tongshi1);
huhansan.Attach(tongshi2);
// 去除观察者对象
huhansan.Detach(tongshi1);
//老板回来
huhansan.SubjectState = "我胡汉三又回来了";
//发出通知
huhansan.Notify();
Console.ReadKey();
}