设计模式之(十、观察者模式(ObServer)/发布订阅模式(Pblish/Subscribe))
来源:互联网 发布:如何调教一个抖m知乎 编辑:程序博客网 时间:2024/04/28 01:54
设计模式之十、观察者模式(ObServer)/发布订阅模式(Pblish/Subscribe)
适用范围:
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
书中的实例:
通过前台服务员观察公司领导,当领导回来后,通知所有观察者对象,告诉他们停止与工作无关的事,专心工作。
观察者模式结构图如下所示:
1、主题接口类ISubject
ISubject.h
Class IObServer;//引用与它耦合的类,否则可能报找不到该类的错误
virtual void Attach(IObServer *o) = 0;
virtual void Detch(IObServer *o) = 0;
virtual void Notify() = 0;
void SetSubject(string subject);
void GetSubject();
protected:
string m_subject;
vector<IObServer*> m_obs;
设置、获取主题信息的方法在cpp中实现即可。
2、观察者接口类IObServer.h
Class ISubject;
virtual void Update() = 0;
protected:
string m_name;
ISubject *m_sub;
3、具体的主题类 CConcreteSubjectA.cpp
CConcreteSubjectA::Attach(IObServer *o)
{
m_obs.push_back(o);
}
//删除某一观察者对象
//因为使用vector的方式来存储,做删除操作时,比较麻烦,只能循环遍历来进行匹配操作,可以考虑使用map可以直接定位.
CConcreteSubjectA::Detch(IObServer *o)
{
vector<IObServer*> ::iterator iter;
for(iter = m_obs.begin(); iter != m_obs.end(); ++iter)
{
if(*iter == 0 )
{
m_obs.erase(iter);
return;
}
}
}
CConcreteSubjectA::Notify()
{
vecotr<IObServer*> ::iterator iter;
IObServer *o;
for(iter = m_obs.begin(); iter != m_obs.end(); ++iter)
{
o = *iter;
o->Update();
}
}
4、具体的观察者对象:CConcreteObServerA.cpp
CConcreteObServerA::CConcreteObServerA(string name, ISubject *sub)
{
m_name = name;
m_sub = sub;
}
CConcreteObServerA::CConcreteObServerA()
{
}
CConcreteObServerA::Update()
{
string mess = m_sub->GetSubject();
mess += m_name;
mess += ",关闭股票,快点工作!";
printf("%s/n", mess.c_str());
}
5、客户端程序main.cpp
CConcreteSubjectA *sub = new CConcreteSubjectA();
CConcreteObServerA *a = new CConcreteObServerA("bixy", sub);
CConcreteObServerA *b = new CConcreteObServerA("bixiaoyang", sub);
CConcreteObServerA *c = new CConcreteObServerA("xiaoyang", sub);
sub->Attach(a);
sub->Attach(b);
sub->Attach(c);
sub->Detch(b);
sub->SetSubject("老板回来了!");
sub->Notify();
if( sub != NULL)
{
delete sub;
}
if( a != NULL )
{
delete a;
}
if( b != NULL )
{
delete b;
}
if( c != NULL )
{
delete c;
}
//释放内存
以上,仅供参考。
- 设计模式之(十、观察者模式(ObServer)/发布订阅模式(Pblish/Subscribe))
- 设计模式初探-观察者模式(OBSERVER)又称发布-订阅(Publish-Subscribe)依赖(Dependents)
- [设计模式] 观察者模式(发布-订阅/Publish-subscribe模式)
- 设计模式之观察者模式(发布-订阅模式publish/Subscribe)
- 观察者模式(Observer Pattern,对象行为型模式,发布-订阅模式 Publish/Subscribe Pattern)
- 设计模式之十:观察者模式(Observer)
- 设计模式(三)观察者模式Observer(发布订阅)
- 设计模式---订阅发布模式(Subscribe/Publish)
- 设计模式---订阅发布模式(Subscribe/Publish)
- JAVA设计模式之十观察者模式或发布订阅模式
- 十六 设计模式之观察者模式(发布订阅模式)
- 设计模式之观察者模式(发布-订阅模式)
- 设计模式之观察者模式(Observer模式)
- 订阅发布模式(Subscribe/Publish)
- 订阅发布模式(Subscribe/Publish)
- java设计模式-观察者(发布-订阅)模式
- java笔记--设计模式之观察者(订阅/发布)模式
- 设计模式之Observer(观察者)
- 关于monodroid的资源
- ulimit & core dump
- oracle忘记登录密码,该怎么办?
- 低效的where 1=1
- asp.net 绑定数据问题
- 设计模式之(十、观察者模式(ObServer)/发布订阅模式(Pblish/Subscribe))
- ASP入门(十二): asp技巧
- read by other session
- 浅谈函数的内聚性
- 最新学习sqlserver2008 集成服务网站
- 基于silverlight的聊天程序
- MD5加密
- 面试笔试题
- Repeater增删改查(内嵌checkbox)版本