设计模式-观察者-C++实现

观察者设计模式:定义对象之间的一种“一对多”的依赖关系,当一个对象状态发生改变的时候,所有依赖这个对象的观察者都会得到通知并且被自动更新。

这种模式也称为“发布-订阅”模式。目标就是发布者,他不知道订阅者是谁,这个对象可以有任意多个订阅者可以接受发布者发送的消息。

通过抽象接口就把目标和观察者进行了解耦,可以单独的修改目标或者对象,也可以随意的增加或者删除观察者。

观察者模式主要依赖于对象维护了一个观察者列表,当对象发出消息后,通过观察者的循环列表依次调用每一个观察者的接口实现消息的传递。

在这里插入图片描述

下面是C++代码的实现方式:

#include <stdio.h>
#include <vector>
using namespace std;

class Subject;

//观察者接口
class Observer {
public:
	virtual void updateSelf(Subject* obj) = 0;
protected:
	Subject* subject;
};

//对象接口
class Subject {
public:
	virtual void attach(Observer* obs) {
		obsList.push_back(obs);
	}

	virtual void notify() {
		vector<Observer*>::iterator it = obsList.begin();
		for (it; it != obsList.end();it++){
			(*it)->updateSelf(this);
		}
	}

	virtual void setData(int d) {
		data = d;
	}

	virtual int getData() {
		return data;
	}

protected:
	int data = 0;
	vector<Observer*> obsList;
};

//具体的对象
class OneSubject :public  Subject {
public:
	OneSubject ();
	~OneSubject ();
};
OneSubject::OneSubject() {
}

OneSubject ::~OneSubject() {
}

//第一个观察者
class FirstObserver :public Observer {
public:
	virtual void updateSelf(Subject* obj) {
		printf("第一个观察者更新数据:%d\n",obj->getData());
	}
};

//第二个观察者
class SecondObserver :public Observer {
public:
	virtual void updateSelf(Subject* obj) {
		printf("第二个观察者更新数据:%d\n", obj->getData());
	}
};



int main() {
	//创建一个对象
	OneSubject* oneSub = new OneSubject;
	//创建观察者
	FirstObserver* first = new FirstObserver;
	SecondObserver* second = new SecondObserver;

	//添加观察者
	oneSub->attach(first);
	//添加观察者
	oneSub->attach(second);

	//设置数据
	oneSub->setData(102);
	//发出通知
	oneSub->notify();

	return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wb175208

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值