观察者模式应用场景:客人敲门,门铃响,护士开门,baby哭醒。实现如下。
1)定义观察者基类CPerson,定义虚函数Act();
2)定义观察者派生类CNurse,CBaby(需要多少定义多少),继承自观察者基类,并实现虚函数Act();
3)定义被观察者基类CRing,里面保存观察者基类的指针,并提供添加,删除观察者的函数Add(),Remove();
4)提供通知函数,通知保存的所有观察者。
#include "pch.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//观察者类 基类
class CPerson
{
public:
CPerson(const string& name) :m_sName(name) {}
virtual ~CPerson() {}
virtual void Act()
{
cout << "no action" << endl;
}
const string GetName() { return m_sName; }
private:
string m_sName;
};
//观察者类的一个派生子类,护士过来开门
class CNurse : public CPerson
{
public:
CNurse(const string& name) : CPerson(name) {}
virtual void Act()
{
cout << "nurse " << GetName() << " come and open the door" << endl;
}
};
//观察者类的一个派生子类,baby醒来
class CBaby : public CPerson
{
public:
CBaby(const string& name) : CPerson(name) {}
virtual void Act()
{
cout << "baby " << GetName() << "weak up and cry" << endl;
}
};
//被观察者基类
class CRing
{
public:
CRing() {}
virtual ~CRing() {}
virtual void Ring()
{
NotifyAll();
}
//添加观察者
void Add(CPerson *person) { m_vectPerson.push_back(person); }
private:
vector<CPerson *>m_vectPerson;
void NotifyAll()
{
vector<CPerson *>::iterator it = m_vectPerson.begin();
while (it != m_vectPerson.end())
{
(*it++)->Act();
}
}
};
class CGuest : public CRing
{
public:
CGuest() {}
virtual ~CGuest(){}
};
int main()
{
CGuest Guest;
CNurse Nurse("Lily");
CBaby Baby("wulitao");
Guest.Add(&Nurse);
Guest.Add(&Baby);
Guest.Ring();//触发信号
system("pause");
}