观察者模式
1)目标类(被观察者)
2)观察者类
3)具体的目标
4)具体的观察者
这四个类之间的关系是怎样的呢?
1)被观察的类
我们可以看到抽象的被观察者类中有三个public的成员函数,这个类图画的不大对,应该还要有一个list<Observer*>的数据成员,用来保存观察者;
这三个成员函数从函数名字就知道其作用,添加观察者,删除观察者,通知观察者。
这几个函数在抽象的被观察者类中应该都是纯虚函数
2)观察者类
只有一个public的update函数,可以加一个被观察者类的指针作为数据成员,当被观察者发生改变时,会调用update更新自己观察到的状态。
3)具体的被观察者,继承了抽象的被观察者类,作为子类实现父类的纯虚函数。
4)具体的观察者,继承了抽象的观察者类
#include <iostream>
#include<vector>
#include<list>
#include<algorithm>
#include <climits>
#include<unordered_map>
using namespace std;
class Subject;
class Observer{//观察者的抽象类
public:
virtual void update()=0;
};
class Subject{//被观察者的抽象类
public:
virtual void attach(Observer*)=0;
virtual void disattach(Observer*)=0;
virtual void Notify()=0;
inline int getindex() {
return index;
}
protected:
list<Observer*> observer_list;
int index;
};
class Weather:public Subject{//被观察的具体类,天气类
static unordered_map<int,string> m_wea;
public:
void attach(Observer*pm) override{
observer_list.push_back(pm);
}
void disattach(Observer*pm) override{
observer_list.remove(pm);
}
void Notify() override{
for(auto pm:observer_list)
pm->update();
}
void setWeather(int i){
index=i;
}
};
unordered_map<int,string> Weather::m_wea={{1,"rain"},{2,"sunny"}};
class People:public Observer{
public:
People(Subject*ps,string name):m_ps(ps),m_name(name){}
void update() override{
cout<<m_name<< "看到的天气是: "<<m_ps->getindex()<<endl;
}
private:
Subject *m_ps;
string m_name;
};
int main(){
Weather*p=new Weather();
People *pp=new People(p,"小米");
int a=111;
p->attach(pp);//相当于Qt中的connect()函数
p->setWeather(a);
p->Notify();
a=99;
p->setWeather(a);
p->Notify();
delete p;
delete pp;
}
参考博客:
[1] https://blog.csdn.net/leonardohaig/article/details/120187956