定义:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个通知者对象。这个通知者对象在状态发生变化时,会通知所有观察者对象,使他们能够自己更新自己。
结构图:
代码:
//通知者接口类
Class Subject
{
private:
//观察者集合
IList<Observer> lObservers = new List<Observer>();
Public:
//增加观察者的方法
void Attach(Observer pObserver)
{
lObservers.Add(pObserver);
}
//删除观察者的方法
void Detach(Observer pObserver)
{
lObservers.Remove(pObserver);
}
//通知
void Notify()
{
foreach (Observer o in lObservers)
{
//循环调用每个观察者的更新方法
o.Update();
}
}
}
//Observers抽象观察者类
Class Observers
{
public:
//定义更新接口
void Update() = 0;
}
//具体观察者类
Class ObserversA : Observers
{
void Update()
{
。。。;
}
}
//客户端
Subject cSubject = new Subject();
cSubject.Attach(new ObserversA());//多个观察者在这里添加
Attach.Notify();
进阶版:委托方式(使用函数引用)
//通知者类
Class Subject
{
Public:
//声明一个委托Update
event EventHandler Update;
//通知
void Notify()
{
Update();
}
}
//具体观察者类A
Class ObserversA
{
void UpdateA()
{
。。。;
}
}
//具体观察者类B
Class ObserversB
{
void UpdateB()
{
。。。;
}
}
//客户端
Subject cSubject = new Subject();
ObserversA* pObserversA = new ObserversA();
ObserversB* pObserversB = new ObserversB();
cSubject.Update += new EventHandler(pObserversA.UpdateA);//这里使用函数引用
cSubject.Update += new EventHandler(pObserversB.UpdateB);
Attach.Notify();
使用时机:
当依赖关系为一对多时;
优点:解耦合,依赖双方都只依赖抽象接口,甚至通知者都不需要知道具体观察者。建立了一套触发机制。
缺点:如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。