Boost库-signals2-signal/slot-应用观察者模式(闹铃-护士-孩子)

#define _SCL_SECURE_NO_WARNINGS

#include<iostream>

#include<boost\signals2.hpp>
#include<boost\random.hpp>
#include<boost\bind.hpp>

typedef boost::variate_generator<boost::rand48, boost::uniform_int<>> bool_rand;
bool_rand g_rand(boost::rand48(time(0)), boost::uniform_int<>(0, 100));

//门铃类
class Ring
{
public:
	typedef boost::signals2::signal<void()> signal_t;
	typedef signal_t::slot_type slot_t;

	boost::signals2::connection Connect(const slot_t &s)
	{
		return alarm.connect(s);
	}
	void Press()
	{
		std::cout << "Ring alarms..." << std::endl;
		alarm();
	}
private:
	signal_t alarm;

};


//护士类
extern char const nurse1[] = "nurse1-Mary";
extern char const nurse2[] = "nurse2-Kate";

template<char const* name>
class Nurse
{
private:
	bool_rand &rand;
public:
	Nurse():rand(g_rand){
	}

	void Action()
	{
		std::cout << name;
		if (rand() > 30)
		{
			std::cout << " wakeup and open door" << std::endl;
		}
		else
		{
			std::cout << " is sleeping..." << std::endl;
		}
	}
};


//儿童类
extern char const baby1[] = "baby1-Tom";
extern char const baby2[] = "baby2-Jerry";

template<char const* name>
class Baby
{
private:
	bool_rand &rand;
public:
	Baby() :rand(g_rand) {
	}

	void Action()
	{
		std::cout << name;
		if (rand() > 50)
		{
			std::cout << " wakeup and crying loudly" << std::endl;
		}
		else
		{
			std::cout << " is sleeping sweetly..." << std::endl;
		}
	}
};

//访客类
class Quest
{
public:
	void Press(Ring &r)
	{
		std::cout << "A quest presses the ring.... " << std::endl;
		r.Press();
	}
};



int main(int argc, char** argv)
{
	Ring r;
	Nurse<nurse1> n1;
	Nurse<nurse2> n2;
	Baby<baby1> b1;
	Baby<baby2> b2;
	Quest g;

	r.Connect(boost::bind(&Nurse<nurse1>::Action,n1));
	r.Connect(boost::bind(&Nurse<nurse2>::Action, n2));

	r.Connect(boost::bind(&Baby<baby1>::Action, b1));
	r.Connect(boost::bind(&Baby<baby2>::Action, b2));

	g.Press(r);

	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫忘输赢

莫忘输赢 - 收钱袋

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值