C++观察者模式

本文探讨了C++中的观察者模式,它定义了一对多的依赖关系,当主题状态改变时,所有依赖者都会收到通知并自动更新。这种模式实现了主题和观察者之间的松耦合,允许两者独立复用,同时支持‘推’和‘拉’两种信息传递方式。代码示例包括`observable.h`和`observer.cpp`。
摘要由CSDN通过智能技术生成

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

总结:观察者模式提供了一种对象设计,让主题和观察者之间松耦合,它们两个对象之间松耦合,可以互相交互,但是对于彼此的细节不太清楚。

松耦合:主题只知道观察者实现了Observer接口,不需要知道观察者的其他信息。在任何的时候,都可以新增观察者或删除观察者。如果在其他地方需要使用主题和观察者,可以轻易复用主题和观察者,两者之间互不影响。

在代码里面,主题可以通知全部的观察者并推送所有的信息,这是主题主动发出的。DisplayA则是一个可以请求部分内容的观察者,因为观察者种类可能很多,不同的观察者有着不同的需求,不是所有的观察者都需要主题的全部信息。这分为了主题主动“推”的模式和观察者主动“拉”的模式。

代码:
observable.h

#pragma once
#include <iostream>
#include <vector>
using namespace std;
class Observer {
public:
	virtual void update(float temperature, float humidity, float pressure) = 0;
};
class Observable
{
public:
	vector<Observer*> arrayList;
	virtual void addObserver(Observer* o) = 0;
	virtual void deleteObserver(Observer* o) = 0;
	virtual void notifyObservers() = 0;
	virtual float getTemperature() = 0;
};
class WeatherData :public Observable {
public:
	WeatherData(float a, float b, float c) {
		this->temperature = a;
		this->humidity = b;
		this->pressure = c;
	}
	void addObserver(Observer* o) {
		arrayList.push_back(o);
	}
	void deleteObserver(Observer* o){
		vector<Observer*>::iterator iter = arrayList.begin();
		for (iter; iter != arrayList.end(); iter++) {
			if (*iter == o) {
				arrayList.erase(iter);
			}
		}
	}
	void notifyObservers() {
		vector<Observer*>::iterator iter = arrayList.begin();
		for (iter; iter != arrayList.end(); iter++) {
			(*iter)->update(temperature,humidity,pressure);
		}
	}
	float getTemperature() {
		return temperature;
	}
	void setTemperature(float t) {
		this->temperature = t;
	}
private:
	float temperature;
	float humidity;
	float pressure;
};
class DisplayA :public Observer {
public:
	DisplayA(Observable* o){
		this->o = o;
		o->addObserver(this);
	}
	void update(float temperature,float humidity,float pressure) {
		this->temperature = temperature;
		this->humidity = humidity;
		this->pressure = pressure;
		cout << "I am DisplayA" << endl;
		cout << "temperature:" << this->temperature << endl;
		cout << "humidity:" << this->humidity << endl;
		cout << "pressure:" << this->pressure << endl<<endl;
	}
	void getTemperature(){
		this->temperature=o->getTemperature();
		cout << "I am DisplayA" << endl;
		cout << "temperature:" << this->temperature << endl;
		cout << "humidity:" << this->humidity << endl;
		cout << "pressure:" << this->pressure << endl << endl;
	}
private:
	Observable* o=NULL;
	float temperature;
	float humidity;
	float pressure;
};
class DisplayB :public Observer {
public:
	DisplayB(Observable* o) {
		o->addObserver(this);
	}
	void update(float temperature, float humidity, float pressure) {
		this->temperature = temperature;
		this->humidity = humidity;
		this->pressure = pressure;
		cout << "I am DisplayB" << endl;
		cout << "temperature:" << this->temperature << endl;
		cout << "humidity:" << this->humidity << endl;
		cout << "pressure:" << this->pressure << endl << endl;
	}
private:
	float temperature;
	float humidity;
	float pressure;
};
class DisplayC :public Observer {
public:
	DisplayC(Observable* o) {
		o->addObserver(this);
	}
	void update(float temperature, float humidity, float pressure) {
		this->temperature = temperature;
		this->humidity = humidity;
		this->pressure = pressure;
		cout << "I am DisplayC" << endl;
		cout << "temperature:" << this->temperature << endl;
		cout << "humidity:" << this->humidity << endl;
		cout << "pressure:" << this->pressure << endl << endl;
	}
private:
	float temperature;
	float humidity;
	float pressure;
};

observer.cpp

#include <iostream>
#include "Observable.h"
using namespace std;
int main()
{
	WeatherData *data=new WeatherData(50,60,70);
	DisplayA* A = new DisplayA(data);
	DisplayB* B = new DisplayB(data);
	DisplayC* C = new DisplayC(data);

	data->notifyObservers();
	data->setTemperature(80);
	A->getTemperature();


}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值