观察者模式
网上介绍观察者模式有很多资料,概括就是观察者依赖于目标者,如果目标的行为或者状态发生了改变,目标者就会改变观察者的状态或者行为。下面就以多个学生和一个老师聊天作为示例。
头文件
"observerAndSubject.h"
//一个人同时和好几个聊天
//抽象观察者
#include <vector>
#include <string>
class ObserverBass
{
public:
ObserverBass(std::string name):m_name(name) {};
virtual void updata(bool flag) = 0;
bool m_flag;
std::string m_name;
};
//抽象主题者
class SubjectBass
{
public:
//连接
virtual void connectObserver(ObserverBass * tempObserver) = 0;
//断开
virtual void detachObserver(ObserverBass* tempObserver) = 0;
//更新状态
virtual void updataObserver(bool flag) = 0;
//获取有多少个观察者
virtual int getObserverNum() = 0;
std::vector<ObserverBass *> m_observerVec;
};
//具体主题者
class mainPerson : public SubjectBass
{
public:
virtual void connectObserver(ObserverBass* tempObserver);
virtual void detachObserver(ObserverBass* tempObserver);
virtual void updataObserver(bool flag);
virtual int getObserverNum();
};
//具体观察者
class CatePerson : public ObserverBass
{
public:
CatePerson(std::string name) :ObserverBass(name) {}
virtual void updata(bool flag) ;
};
cpp文件
#include "observerAndSubject.h"
#include <iostream>
void mainPerson::connectObserver(ObserverBass* tempObserver)
{
m_observerVec.emplace_back(tempObserver);
}
void mainPerson::detachObserver(ObserverBass* tempObserver)
{
for (std::vector<ObserverBass*>::iterator var = m_observerVec.begin();
var != m_observerVec.end();)
{
if (*var == tempObserver)
{
var =m_observerVec.erase(var);
}
else
{
++var;
}
}
}
void mainPerson::updataObserver(bool flag)
{
for (auto observer : m_observerVec)
{
observer->updata(flag);
}
}
int mainPerson::getObserverNum()
{
return m_observerVec.size();
}
void CatePerson::updata(bool flag)
{
if (!flag)
{
std::cout << "TA掉线了" << std::endl;
}
else
{
std::cout << "TA上线了" << std::endl;
}
}
以上代码就是实现抽像观察者和目标者以及具体观察者和目标者的demo。
main函数
#include <iostream>
#include "observerAndSubject.h"
using namespace std;
int main()
{
//创建一个老师,好比一个主题者
SubjectBass* teach = new mainPerson();
//创建四个学生
ObserverBass* studentone = new CatePerson("studentone");
ObserverBass* studentwo = new CatePerson("studentwo");
ObserverBass * studenthree = new CatePerson("studenthree");
ObserverBass* studenfour = new CatePerson("studenfour");
teach->connectObserver(studentone);
teach->connectObserver(studentwo);
teach->connectObserver(studenthree);
teach->connectObserver(studenfour);
//老师上线了
teach->updataObserver(true);
std::cout << "学生个数" << teach->getObserverNum() << std::endl;
teach->detachObserver(studenthree);
std:cout << "学生三断开" << std::endl;
std::cout << "学生个数" << teach->getObserverNum() << std::endl;
//老师掉线了
teach->updataObserver(false);
}
以上代码只是实现的基础功能,实际功能可以根据自己的需求去实现。