Boost.signals2访客按下门铃,门铃响后,护士和婴儿各自不同的反应

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);
}

猜你喜欢

转载自blog.csdn.net/knightonhourse/article/details/80251778