c++之观察者模式

观察者模式属于行为型模式,即当对象间存在一对多关系时,则考虑使用观察者模式。比如,当一个对象被修改时,则会自动通知依赖它的对象。

栗子场景:课堂上,李老师(具体通知者)叫小明(具体观察者)和大红(具体观察者)坐下,然后再单独叫小明站起来。

代码:

#include <iostream>
#include <list>

using namespace std;

//抽象观察者
class Observer{
public:
	virtual void update(std::string) = 0;
};

//具体观察者小明
class ConcreateObserverXiaoMing :public Observer
{
public:
	virtual void update(std::string s)
	{
		cout << "XiaoMing"<< s.c_str() << endl;
	}
};

//具体观察者大红
class ConcreateObserverDaHong :public Observer
{
public:
	virtual void update(std::string s)
	{
		cout << "DaHong " << s.c_str() << endl;
	}
};

//抽象通知者
class Subject{
public:
	virtual void Attach(Observer *ob) = 0;
	virtual void Detach(Observer *ob) = 0;
	virtual void Notify() = 0;
};

//具体通知者 李老师
class ConcreateSubjectLiLaoshi :public Subject
{
public:
	//增加观察者
	virtual void Attach(Observer *ob)
	{
		if (ob != nullptr)
		{
			m_observer.push_back(ob);
		}
	}

	//移除观察者
	virtual void Detach(Observer *ob)
	{
		if (ob != nullptr)
		{
			m_observer.remove(ob);
		}
	}

	//通知
	virtual void Notify()
	{
		//list<Observer*>::iterator iter = m_observer.begin();
		auto iter = m_observer.begin();
		for (; iter != m_observer.end(); iter++)
		{
			(*iter)->update(m_staus);
		}
	}

	void setStatus(std::string s)
	{
		m_staus = s;
	}

private:
	list<Observer*> m_observer;
	std::string m_staus;
};

int main()
{
	ConcreateSubjectLiLaoshi conSub;
	ConcreateObserverXiaoMing xiaoMing;
	ConcreateObserverDaHong daHong;
	conSub.Attach(&xiaoMing);
	conSub.Attach(&daHong);

	conSub.setStatus("坐下");
	conSub.Notify();

	conSub.Detach(&daHong);
	conSub.setStatus("站起来");
	conSub.Notify();

	return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值