设计模式介绍:观察者模式(observer)
来源:互联网 发布:英菲克看电视软件下载 编辑:程序博客网 时间:2024/05/16 15:57
观察者模式(又称发布/订阅模式)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,,所有依赖于它的对象都得到通知并被自动更新。
常见的应用程序框架中有很多观察者模式的应用,比如 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;
- }
0 0
- 设计模式介绍:观察者模式(observer)
- 设计模式介绍之七:观察者模式(observer)
- 设计模式--观察者(Observer)
- 设计模式-观察者(Observer)
- 观察者设计模式(Observer)
- Observer(观察者)设计模式
- 观察者设计模式Observer
- 观察者设计模式(observer)
- observer(观察者设计模式)
- Observer(观察者)设计模式
- 设计模式之Observer(观察者模式)
- 设计模式之Observer(观察者模式)
- 设计模式 (十五)观察者模式(Observer)
- 设计模式 (十五)观察者模式(Observer)
- 【设计模式】之观察者模式(Observer)
- 设计模式之--观察者模式(Observer)
- 设计模式(二)Observer - 观察者模式
- 设计模式之观察者(Observer)模式
- nyoj 38 布线问题 (prime、kruskal算法)
- 刷新csdn浏览量
- Codeforces Round #291 (Div. 1)B. Drazil and Tiles
- Linux IPC实践(13) --System V IPC综合实践
- POJ 2528 Mayor's posters (hash+线段树成段更新)
- 设计模式介绍:观察者模式(observer)
- HDU 1394 Minimum Inversion Number
- Codeforces #291 (Div. 2) D. R2D2 and Droid Army(RMQ+二分)
- Linux多线程实践(1) --线程理论
- UML 工具 UMLet 试用
- DVB数字电视系统简介(DVB-C,DVB-S,DVB-T)
- 黑客
- Linux程序设计(Linux目录权限)
- PAT1081Rational Sum