Boost.signals2访客按下门铃,门铃响后,护士和婴儿各自不同的反应。
实现代码如下:
#include<cstdlib>
#include<ctime>
#include<string>
#include<iostream>
using namespace std;
#include<boost/ref.hpp>
#include<boost/bind.hpp>
#include<boost/function.hpp>
#include<boost/signals2.hpp>
using namespace boost;
//门铃
class CRing{
private:
boost::signals2::signal<void()> oSignal;
public:
boost::signals2::connection Attach(const boost::signals2::signal<void()>::slot_type& s){return oSignal.connect(s);}
bool Detach(boost::signals2::connection& c){c.disconnect(); return true;}
void Alarm(){ cout << "Ring Alarm..." << endl; oSignal();}
};
//陌生的访客
class CGuest{
public:
void Press(CRing& ring){
cout << "A guest presses the ring on the door." << endl;
ring.Alarm();
}
};
//护士
class CNurse{
private:
string sName;
public:
CNurse(string name){sName = name;}
void Action(){
cout << sName;
if(rand() > 30) cout << " wakes up and open the door." << endl;
else cout << " is sleeping..." << endl;
}
};
//婴儿
class CBaby{
private:
string sName;
public:
CBaby(string name){sName = name;}
void Action(){
cout << sName;
if(rand() > 50) cout << " wakes up crying loudly..." << endl;
else cout << " is sleeping sweetly..." << endl;
}
};
//情景:访客按下门铃,护士和婴儿各自不同的反应
void main()
{
srand((unsigned)time(NULL));//设置随机数的种子
CGuest oGuest; CRing oRing;//访客和门铃
//两个护士
CNurse oNurseMary("Mary");
CNurse oNurseKate("Kate");
//两个婴儿
CBaby oBabyTom("Tom");
CBaby oBabyJerry("Jerry");
//护士和婴儿听到门铃后都会做出相应的反应。
//所以门铃是被观察的主题,护士和婴儿都是观察者
boost::signals2::connection oConnMary = oRing.Attach(boost::bind(&CNurse::Action, boost::ref(oNurseMary)));
boost::signals2::connection oConnKate = oRing.Attach(boost::bind(&CNurse::Action, boost::ref(oNurseKate)));
boost::signals2::connection oConnTom = oRing.Attach(boost::bind(&CBaby::Action, boost::ref(oBabyTom)));
boost::signals2::connection oConnJerry = oRing.Attach(boost::bind(&CBaby::Action, boost::ref(oBabyJerry)));
//护士Kate临时有事儿,离开了房间,取消了对门铃的监听
oRing.Detach(oConnKate);
//访客按下门铃,触发一系列的事件
oGuest.Press(oRing);
}