观察者模式属于行为型模式,即当对象间存在一对多关系时,则考虑使用观察者模式。比如,当一个对象被修改时,则会自动通知依赖它的对象。
栗子场景:课堂上,李老师(具体通知者)叫小明(具体观察者)和大红(具体观察者)坐下,然后再单独叫小明站起来。
代码:
#include <iostream>
#include <list>
using namespace std;
//抽象观察者
class Observer{
public:
virtual void update(std::string) = 0;
};
//具体观察者小明
class ConcreateObserverXiaoMing :public Observer
{
public:
virtual void update(std::string s)
{
cout << "XiaoMing"<< s.c_str() << endl;
}
};
//具体观察者大红
class ConcreateObserverDaHong :public Observer
{
public:
virtual void update(std::string s)
{
cout << "DaHong " << s.c_str() << endl;
}
};
//抽象通知者
class Subject{
public:
virtual void Attach(Observer *ob) = 0;
virtual void Detach(Observer *ob) = 0;
virtual void Notify() = 0;
};
//具体通知者 李老师
class ConcreateSubjectLiLaoshi :public Subject
{
public:
//增加观察者
virtual void Attach(Observer *ob)
{
if (ob != nullptr)
{
m_observer.push_back(ob);
}
}
//移除观察者
virtual void Detach(Observer *ob)
{
if (ob != nullptr)
{
m_observer.remove(ob);
}
}
//通知
virtual void Notify()
{
//list<Observer*>::iterator iter = m_observer.begin();
auto iter = m_observer.begin();
for (; iter != m_observer.end(); iter++)
{
(*iter)->update(m_staus);
}
}
void setStatus(std::string s)
{
m_staus = s;
}
private:
list<Observer*> m_observer;
std::string m_staus;
};
int main()
{
ConcreateSubjectLiLaoshi conSub;
ConcreateObserverXiaoMing xiaoMing;
ConcreateObserverDaHong daHong;
conSub.Attach(&xiaoMing);
conSub.Attach(&daHong);
conSub.setStatus("坐下");
conSub.Notify();
conSub.Detach(&daHong);
conSub.setStatus("站起来");
conSub.Notify();
return 0;
}