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