ObserverPattern.h:
#ifndef OBSERVER_PATTERN_H
#define OBSERVER_PATTERN_H
#include <list>
class IObserver
{
public:
virtual ~IObserver() = default;
virtual void update() = 0;
};
class ISubject
{
public:
void addObserver(IObserver* o)
{
observers.push_back(o);
}
void removeObserver(IObserver* o)
{
observers.remove_if([o](const IObserver* item){
return o == item;
});
}
void Notify()
{
for (IObserver* o : observers)
{
o->update();
}
}
private:
std::list<IObserver*> observers;
};
#endif
ObserverPattern.cpp:
#include <iostream>
#include "observerPattern.h"
class TempController : public ISubject
{
public:
void setTemp(int _temp)
{
temp = _temp;
Notify();
}
int getTemp() const
{
return temp;
}
private:
int temp { 0 };
};
class AirConditioner : public IObserver
{
public:
AirConditioner(TempController* _current)
{
current = _current;
current->addObserver(this);
}
~AirConditioner()
{
current->removeObserver(this);
}
virtual void update() override
{
int temp = current->getTemp();
if (temp > 30)
std::cout << "too hot, open cold mode" << std::endl;
else if (temp < 0)
std::cout << "too cold, open warm mode" << std::endl;
}
private:
TempController* current;
};
class Fan : public IObserver
{
public:
Fan(TempController* _current)
{
current = _current;
current->addObserver(this);
}
~Fan()
{
current->removeObserver(this);
}
virtual void update() override
{
int temp = current->getTemp();
if (temp > 25 && temp < 30)
std::cout << "a little hot, open fan" << std::endl;
else if (temp > 30)
std::cout << "too hot, please open air conditioner" << std::endl;
}
private:
TempController* current;
};
int main()
{
TempController tempController;
AirConditioner airConditioner(&tempController);
Fan fan(&tempController);
tempController.setTemp(26);
tempController.setTemp(35);
tempController.setTemp(-1);
return 0;
}