观察者模式(又称发布/订阅模式)定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,,所有依赖于它的对象都得到通知并被自动更新。
常见的应用程序框架中有很多观察者模式的应用,比如 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;
}
好啦,以上就是观察者模式的一个简单实现。留心的人会在生活和软件系统中发现观察者模式的各种各样的具体应用(比如电话留言、QQ好友上线通知、安卓中的各种 Listener 接口)。
回顾一哈:
分享到:
相关推荐
设计模式C++学习之观察者模式(Observer)
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)
观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。
观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...
观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...
Observer (观察者模式) 又叫做发布/订阅(Publish/Subscribe)模式。 当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响...
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式
观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
观察者模式是目前应用最广、影响范围最大的模式之一,因为 Observer 的一个实例 MVC结构(Model/View/Control )在系统开发架构设计中有着很重要的地位和意义,实现了业务逻辑和表示层的解耦。下面示例代码以篮球...
NULL 博文链接:https://lgh3292.iteye.com/blog/600905
NULL 博文链接:https://jacky-dai.iteye.com/blog/1132063
Observer模式定义对象间的一对多的依赖关系,当一个对象(被观察者)的状态发生改变...从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。
用c++和lua实现的观察者模式小栗子,其中c++版本参考了别人的实现
NULL 博文链接:https://henry406.iteye.com/blog/435428
NULL 博文链接:https://lgd-java2eye.iteye.com/blog/760350