观察者模式又叫广播模式,顾名思义,是一对多的通知机制。
观察者模式需要定义的父类有广播类和观察者类。
广播类需要定义观察者的添加,删除以及广播。我们需要使用一个容器存放观察者,通常是一个动态数组。
观察者类核心方法仅仅需要定义一个接收。
以下是简单的示例:
#include <iostream>
#include <vector>
using namespace std;
class observer
{
public:
virtual void receive(std::string) = 0;
};
class subject
{
public:
virtual void attach(observer* obs) = 0;
virtual void detach(observer* obs) = 0;
virtual void notify(std::string) = 0;
private:
std::vector<observer*> obsList;
};
class subjectSon:public subject
{
public:
void attach(observer* obs) override
{
obsList.push_back(obs);
}
void detach(observer* obs) override
{
for (vector<observer*>::iterator it=obsList.begin();it!=obsList.end();it++)
{
if (*it == obs)
{
obsList.erase(it);
break;
}
}
}
void notify(std::string message) override
{
for (observer *ob : obsList)
{
ob->receive(message);
}
}
private:
std::vector<observer*> obsList;
};
class observerObj:public observer
{
public:
void receive(std::string str) override
{
cout << "接收到的消息:"<<str.c_str()<<endl;
}
};
int main()
{
std::cout << "Hello World!\n"<<endl;
//广播实例
subjectSon sub;
//观察者实例
observerObj obs1;
observerObj obs2;
//注册
sub.attach(&obs1);
sub.attach(&obs2);
//广播
std::string mess = "广播消息";
sub.notify(mess);
//删除观察者
sub.detach(&obs1);
mess = "删除一个观察者";
sub.notify(mess);
}