Observer观察者模式(C++)

Subject+Observers=Observer Pattern
观察者模式定义:
对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会自动获得通知
观察者模式应用:
主题对象只与观察者基类有耦合
客户配置观察者的数量与类型
Observers首先要知道Subject,然后把自己注册到Subject中
Subject保存所有注册过的Observer,当状态发生变化时,广播给所有注册过的观察者
Subject可以采用push或者pull的方式没有Observer交流信息
在这里插入图片描述

class Observer;
class Subject//抽象类	主题
{
public:
	virtual void registerObserver(Observer*)=0;
	virtual void removeObserver(Observer*)=0;
	virtual void notifyObserver()=0;
};

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

class ConcreteSubject:public Subject//具体主题
{
private:
	list<Observer*> observers;
	int val=0;
public:
	void registerObserver(Observer* o){observers.push_back(o);}//观察者订阅
	void removeObserver(Observer* o) { observers.remove(o); }//观察者取消订阅
	void notifyObserver()//通知观察者
	{
		for (auto it = observers.begin(); it != observers.end(); it++)
			(*it)->update(this->val);
	}
	void updateVal(int val)
	{
		cout << "The DOW is now " << val <<"."<< endl;
		this->val = val;
		notifyObserver();
	}
};

class ConcreteObserver :public Observer//具体观察者
{
private:
	int val=0;
	string name;
public:
	ConcreteObserver(string name)
	{
		this->name = name;
	}
	void update(int val)
	{
		//val下降超过2000
		if (this->val - val > 2000)
		{
			cout << name <<" know that Trump was sent to the sun." <<endl;
		}
		this->val = val;
	}
};

int main()
{
	ConcreteSubject* DOW = new ConcreteSubject;//具体主题	道琼斯指数
	ConcreteObserver* MelonEater1 = new ConcreteObserver("MelonEater1");//具体观察者	吃瓜群众1号
	ConcreteObserver* MelonEater2 = new ConcreteObserver("MelonEater2");//具体观察者	吃瓜群众2号
	DOW->updateVal(32200);//道琼斯指数更新
	DOW->registerObserver(MelonEater1);//吃瓜群众1号关注主题
	DOW->updateVal(30000);
	DOW->updateVal(27800);//下降超过2000点,通知吃瓜群众,川建国向太阳发射
	DOW->registerObserver(MelonEater2);//吃瓜群众2号关注主题
	DOW->updateVal(28000);
	DOW->updateVal(25500);
	DOW->removeObserver(MelonEater1);//吃瓜群众1号取消关注主题
	DOW->updateVal(23200);
}

运行结果
The DOW is now 32200.
The DOW is now 30000.
The DOW is now 27800.
MelonEater1 know that Trump was sent to the sun.
The DOW is now 28000.
The DOW is now 25500.
MelonEater1 know that Trump was sent to the sun.
MelonEater2 know that Trump was sent to the sun.
The DOW is now 23200.
MelonEater2 know that Trump was sent to the sun.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值