观察者模式(又称发布/订阅模式)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,,所有依赖于它的对象都得到通知并被自动更新。
常见的应用程序框架中有很多观察者模式的应用,比如 MFC 的 Doc/View ,Qt 中的信号与槽、 Model/View Architecture,安卓中的广播接收者( Broadcast Receiver )。
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;当一个对象必须通知其它对象,而它又不能假定其它对象是谁,换言之, 你不希望这些对象是紧密耦合的;……这些场景下都可以使用观察者模式。
下图是观察者模式的 UML 表示:
下面提供一个观察者模式的实例。这个实例描述的是这么一个情况:有人想看花,希望花开的时候能够得到通知。
先看目标和观察者接口的声明:
class BloomObserver{
public:
BloomObserver();
virtual ~BloomObserver();
virtual void bloomed() = 0;
};
class Rose{
public:
Rose();
~Rose();
void attach(BloomObserver *pObserver);
void detach(BloomObserver *pObserver);
void notify();
void setBloomed();
bool bloomed();
private:
bool m_bBloomed;
BloomObserverList m_observers;
};Rose::Rose():m_bBloomed(false)
{}
void Rose::attach(BloomObserver *pObserver){
m_observers.add(pObserver);
}
void Rose::detach(BloomObserver *pObserver){
m_observers.remove(pObserver);
}
void Rose::notify(){
foreach(BloomObserver *observer, m_observers)
observer->bloomed();
}
void Rose::setBloomed(){
m_bBloomed = true;
notify();
}
bool Rose::bloomed(){
return m_bBloomed;
}class ObserverA : public BloomObserver{
void bloomed(){
callFriendsDriveCarToSomewhere();
}
};
class ObserverB : public BloomObserver{
void bloomed(){
writeBlog();
}
};
class ObserverC : public BloomObserver{
void bloomed(){
takeCameraToSomewhere();
}
};int main(int argc, char**argv){
Rose rose;
ObserverA *a = new ObserverA;
ObserverB *b = new ObserverB;
ObserverC *c = new ObserverC;
rose.attach(a);
rose.attach(b);
rose.attach(c);
//doSomethingHere();
rose.setBloomed();
rose.detach(a);
rose.detach(b);
rose.detach(c);
delete a; delete b; delete c;
return 0;
}
原文:http://blog.csdn.net/foruok/article/details/19422141