观察者模式
来源:互联网 发布:奥运会易建联数据 编辑:程序博客网 时间:2024/06/12 20:10
观察者模式(Observer)定义了对象间一对多的联系。当一个对象的状态发生变化时,所有与它有联系的观察者对象都会得到通知。观察者模式将被观察的目标和观察者解耦,一个目标可以有任意多的观察者,观察者也可以观察任意多的目标,构成复杂的联系,而每个观察者都不知道其他观察者的存在。
GOOD:定义了一种一对多的关系,让多个观察对象(公司员工)同时监听一个主题对象(秘书),主题对象状态发生变化时,会通知所有的观察者,使它们能够更新自己。
#include <string>
#include <iostream>
#include <vector>
using namespace std;
-------------------------------------------------------------------------------
class SecretaryBase;
-------------------------------------------------------------------------------
class CObserverBase
{
protected:
string name;
SecretaryBase* sub;
public:
CObserverBase(string strname,SecretaryBase* strsub)
{
name=strname;
sub=strsub;
}
virtual void Update()=0;
};
-------------------------------------------------------------------------------
//具体的观察者,看股票的class StockObserver : public CObserverBase
{
public:StockObserver(string strname,SecretaryBase* strsub) : CObserverBase(strname,strsub)
{
}
virtual void Update();
};
-------------------------------------------------------------------------------
class NBAObserver : public CObserverBase
{
public:
NBAObserver(string strname,SecretaryBase* strsub) :
CObserverBase(strname,strsub){}
virtual void Update();
};
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
class SecretaryBase
{
public:
string action;
vector<CObserverBase*> observers;
public:
virtual void Attach(CObserverBase* observer)=0;
virtual void Notify()=0;
};
-------------------------------------------------------------------------------
class Secretary :public SecretaryBase
{
public:
void Attach(CObserverBase* ob)
{
observers.push_back(ob);
}
void Notify()
{
vector<CObserverBase*>::iterator p = observers.begin();
while (p!=observers.end())
{
(*p)>Update(); //通知观察者
p++;
}
}};
void StockObserver::Update() //通知观察者
{
cout<<name<<":"<<sub>action<<",不要玩股票了,要开始工作了"<<endl;
}
void NBAObserver::Update()
{
cout<<name<<":"<<sub>action<<",不要看 NBA了,老板来了"<<endl;
}
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
int main()
{
SecretaryBase *p=new Secretary(); //创建观察者
//被观察的对象
CObserverBase *s1= new NBAObserver("小李",p);
CObserverBase *s2 = new StockObserver("小赵",p);
//加入观察队列
p>Attach(s1);
p>Attach(s2);
//事件
p>action="老板来了";
//通知
p>Notify();
return 0;
}
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- Code First :使用Entity. Framework编程(7)
- Android 中主Activity和任一Activity进行跳转
- HDOJ 1297
- RedHat 网络配置
- Shadow Caster Culling
- 观察者模式
- kevin
- HDOJ 1715
- 更新文件避免浏览器缓存的解决方法(源码)
- 抽象编程语言(APL)架构
- cpu温升过高导致的自动保护关机
- BIN/HEX/AXF/ELF文件说明
- C语言中内嵌汇编asm语法
- Jsfl—更新资源(library.updateItem())