cpp实现观察者模式
示例代码
#include <thread>
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Observer;
class Subject{
public:
Subject();
~Subject();
public:
inline int getState() {
return state;
}
void setState(int state);
void attach(Observer* observer);
void notifyAllObservers();
private:
std::vector<Observer*> observers;
int state;
};
class Observer{
public:
virtual void update() {
std::cout<<" Observer::update() \n";
}
protected:
Subject* subject;
};
class BinaryObserver:public Observer{
public:
BinaryObserver(Subject* s) {
this->subject = s;
this->subject->attach(this);
std::cout<<" BinaryObserver::BinaryObserver "<<"\n";
}
~BinaryObserver() {
std::cout<<" BinaryObserver::~BinaryObserver "<<"\n";
}
public:
void update() {
std::cout<<" BinaryObserver::update() state: "<<subject->getState()<<" \n ";
}
};
class OctalObserver:public Observer{
public:
OctalObserver(Subject* s) {
this->subject = s;
this->subject->attach(this);
std::cout<<" OctalObserver::OctalObserver "<<"\n";
}
~OctalObserver() {
std::cout<<" OctalObserver::~OctalObserver "<<"\n";
}
public:
void update() {
std::cout<<" OctalObserver::update() state: "<<subject->getState()<<" \n ";
}
};
class HexaObserver:public Observer{
public:
HexaObserver(Subject* s) {
this->subject = s;
this->subject->attach(this);
std::cout<<" HexaObserver::HexaObserver "<<"\n";
}
~HexaObserver() {
std::cout<<" HexaObserver::~HexaObserver "<<"\n";
}
public:
void update() {
std::cout<<" HexaObserver::update() state: "<<subject->getState()<<" \n ";
}
};
Subject::Subject() {
std::cout<<" Subject::Subject "<<"\n";
observers.clear();
state = 0;
}
Subject::~Subject() {
std::cout<<" Subject::~Subject "<<"\n";
for(auto it = observers.begin(); it != observers.end(); )
{
Observer* obp = *it;
if(obp) {
delete obp;
obp = NULL;
}
it = observers.erase(it);
}
}
void Subject::setState(int state) {
this->state = state;
notifyAllObservers();
}
void Subject::attach(Observer* observer) {
observers.push_back(observer);
}
void Subject::notifyAllObservers() {
for(auto it = observers.begin(); it != observers.end(); ++it)
{
(*it)->update();
}
}
int main(int argc, char* argv[]) {
Subject subject;
BinaryObserver* bop = new BinaryObserver(&subject);
OctalObserver* oop = new OctalObserver(&subject);
HexaObserver* hop = new HexaObserver(&subject);
std::cout<<" First state change: 15 "<<"\n";
subject.setState(15);
std::cout<<" Second state change: 10 "<<"\n";
subject.setState(10);
}