观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
总结:观察者模式提供了一种对象设计,让主题和观察者之间松耦合,它们两个对象之间松耦合,可以互相交互,但是对于彼此的细节不太清楚。
松耦合:主题只知道观察者实现了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();
}
结果: