-
观察者模式:一种行为型设计模式
-
应用场景:
观察者模式定义了对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种交互也称为发布-订阅(publish-subscribe)。
观察者模式在设计模式中的地位非常高,在各大框架中的应用随处可见。
Qt框架中的信号槽机制就是观察者模式的典型应用:通过用户的点击,触发与按键点击所绑定的槽函数。 -
举例:
假设公司中的Boss要发邮件通知所有下属员工,那么首先需要在Boss端保存一个所有下属的邮箱列表,
这样Boss要统一通知所有下属员工时,直接向列表中的邮箱逐个发送即可。 -
实现方式:
Boss类就是被观察者类,类中要有一个用以保存所有下属邮箱的容器,还要有一个通知容器中所有对象的方法。
每名下属员工为一个观察者对象,有一个被通知的方法。
以下是观察者模式的简单代码实现
#include <iostream>
#include <set>
using namespace std;
//观察者抽象类
class Observer
{
public:
virtual void ReceiveMail(string strMessage) = 0;
};
//被观察者抽象类
class Subject
{
public:
virtual void AddObserver(Observer* pObserver) = 0;
virtual void DeleteObserver(Observer* pObserver) = 0;
virtual void SendMail(string strMessage) = 0;
};
//被观察者实现类
class Boss:public Subject
{
public:
//添加观察者
void AddObserver(Observer *pObserver)
{
setObs.insert(pObserver);
}
void DeleteObserver(Observer *pObserver)
{
setObs.erase(pObserver);
}
//通知所有观察者
void SendMail(string strMessage)
{
for(auto iter = setObs.begin(); iter != setObs.end(); ++iter)
{
(*iter)->ReceiveMail(strMessage);
}
}
private:
//存放观察者的容器
set<Observer*> setObs;
};
//观察者实现类
class Staff:public Observer
{
public:
Staff(string strName):m_strName(strName){}
//收到通知,取邮件并显示
void ReceiveMail(string strMessage)
{
cout << "Staff " << m_strName << " Receive Mail:" << strMessage << endl;
}
private:
string m_strName;
};
主函数中的使用
int main()
{
Subject* pBoss = new Boss();
Observer* pStaffA = new Staff("Mark");
pBoss->AddObserver(pStaffA);
Observer* pStaffB = new Staff("Jeremy");
pBoss->AddObserver(pStaffB);
pBoss->SendMail("test");
return 0;
}
控制台输出结果
Staff Mark Receive Mail:test
Staff Jeremy Receive Mail:test
如有错误,欢迎指正
网友评论