1.观察者模式简介
- 英文名称
Observer - 主要目的
定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。 - 使用场景
1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面;
2.当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变;
3.当一个对象必须通知其他对象,而它又不能假定其他对象是谁。
2.观察者模式代码示例
- 测试平台
1.开发语言:C++
2.开发工具:VS2015
3.操作系统:Win7 X64 代码说明
1.Observer–抽象观察者,定义基本接口;
2.MarketEmployee、DevelopEmployee–具体观察者类,分别用于表示市场部和研发部职员;
3.Subject–抽象通知者,提供基本接口定义;
4.Assistant–具体通知者,总经理助理。注意:
1.本例用观察者模式来描述助理通知事件。具体代码
class Observer
{
public:
//函数功能:观察者构造函数
//参数: const string strName[IN] -- 姓名
//返回值: 无
Observer(const string strName)
{
this->m_strName = strName;
}
//函数功能:更新当前状态
//参数: const string strNotifyInfo[IN] -- 通知内容
//返回值: 无
virtual void UpdateState(const string strNotifyInfo) = 0;
protected:
string m_strName; //观察者姓名
};
//市场部人员,具体观察者
class MarketEmployee :public Observer
{
public:
//函数功能:观察者构造函数
//参数: const string strName[IN] -- 姓名
//返回值: 无
MarketEmployee(const string strName) :Observer(strName)
{
}
//函数功能:更新当前状态
//参数: const string strNotifyInfo[IN] -- 通知内容
//返回值: 无
virtual void UpdateState(const string strNotifyInfo)
{
cout << "市场部" <<this->m_strName<<"收到通知:" << strNotifyInfo << endl;
if ("研发部加班" == strNotifyInfo)
{
cout << "市场部" << this->m_strName << "太好了,没咱啥事了,可以正常下班了!" << endl;
}
else if ("全体加班" == strNotifyInfo)
{
cout << "市场部"<<this->m_strName<<"崩溃了,又要加班!" << endl;
}
}
};
//研发部人员,具体的观察者
class DevelopEmployee :public Observer
{
public:
//函数功能:观察者构造函数
//参数: const string strName[IN] -- 姓名
//返回值: 无
DevelopEmployee(const string strName) :Observer(strName)
{
}
//函数功能:更新当前状态
//参数: const string strNotifyInfo[IN] -- 通知内容
//返回值: 无
virtual void UpdateState(const string strNotifyInfo)
{
cout << "研发部" << this->m_strName << "收到通知:" << strNotifyInfo << endl;
if ("研发部加班" == strNotifyInfo)
{
cout << "研发部" << this->m_strName << "崩溃了,又是咱们部门加班!" << endl;
}
else if ("全体加班" == strNotifyInfo)
{
cout << "研发部" << this->m_strName << "好吧,又加班!不过还好有其他人陪。" << endl;
}
}
};
//抽象通知者,提供基本接口定义
class Subject
{
public:
//函数功能:增加一个观察者
//参数: Observer* pObserver[IN] -- 新的观察者
//返回值: 无
virtual void Attach(Observer* pObserver) = 0;
//函数功能:移除一个观察者
//参数: Observer* pOberser[IN] -- 要移除的观察者
//返回值: 无
virtual void Detach(Observer* pObserver) = 0;
//函数功能:发出通知
//参数: const string strNotifyInfo[IN] -- 通知内容
//返回值: 无
virtual void Notify(const string strNotifyInfo) = 0;
protected:
list<Observer*> m_ObserverList; //观察者列表
};
//具体通知者,总经理助理
class Assistant :public Subject
{
//函数功能:增加一个观察者
//参数: Observer* pObserver[IN] -- 新的观察者
//返回值: 无
void Attach(Observer *pObserver)
{
if (pObserver != NULL)
{
m_ObserverList.push_back(pObserver);
}
}
//函数功能:移除一个观察者
//参数: Observer* pOberser[IN] -- 要移除的观察者
//返回值: 无
void Detach(Observer *pOberser)
{
if (pOberser != NULL)
{
this->m_ObserverList.remove(pOberser);
}
}
//函数功能:发出通知
//参数: const string strNotifyInfo[IN] -- 通知内容
//返回值: 无
void Notify(const string strNotifyInfo)
{
for each (Observer* pServer in this->m_ObserverList)
{
pServer->UpdateState(strNotifyInfo);
}
}
};
int main()
{
//创建通知者,即总经理助理
Subject* pAssistant = new Assistant();
//创建观察者
Observer* pXiaoWang = new MarketEmployee("小王");
Observer* pXiaoLi = new DevelopEmployee("小李");
Observer* pXiaoZhang = new DevelopEmployee("小张");
//加入观察队列
pAssistant->Attach(pXiaoWang);
pAssistant->Attach(pXiaoLi);
pAssistant->Attach(pXiaoZhang);
//事件1
pAssistant->Notify("全体加班");
cout << endl;
//事件2
pAssistant->Notify("研发部加班");
cout << endl;
//小张和助理闹矛盾了,助理将小张移出通知序列
pAssistant->Detach(pXiaoZhang);
//新事件
pAssistant->Notify("全体加班");
cout << endl;
delete pXiaoWang;
pXiaoWang = NULL;
delete pXiaoLi;
pXiaoLi = NULL;
delete pXiaoZhang;
pXiaoZhang = NULL;
getchar();
return 0;
}
- 输出结果
栏目导航
上一篇:设计模式学习笔记(C++实现)(十九)–备忘录模式
下一篇:无
参考文献:
1.《设计模式:可复用面向对象软件的基础》