/ Observer.h
#ifndef dOBSR
#define dOBSRclass Observer
{
private:
public:
virtual void Update() = 0;
};
#endif dOBSR
/ Subject.h
#ifndef dSUB
#define dSUB
#include <list>
#include "Observer.h"
using namespace std;
class Subject
{
private:
list<Observer*> obsrList;
public:
void Attach(Observer* obsr) { obsrList.push_back(obsr);};
void Dettach(Observer* obsr)
{
list<Observer*>::iterator i;
for(i=obsrList.begin();i!=obsrList.end();i++)
{
if((*i) == obsr)
obsrList.erase(i);
}
};
void Notify()
{
list<Observer*>::iterator i;
for(i=obsrList.begin();i!=obsrList.end();i++)
{
(*i)->Update();
}
};
};
#endif dSUB
/ConcreteObserver.h
#define dCO
#include "Observer.h"
#include "ConcreteSubject.h"
#include <iostream>
using namespace std;
class ConcreteObserver : public Observer
{
private:
string ObsrName;
string ObsrState;
ConcreteSubject* subject;
public:
ConcreteObserver(ConcreteSubject* sub,string name)
{
this->subject = sub;
this->ObsrName = name;
};
void Update()
{
this->ObsrState = this->subject->getState();
cout << "Observer:" << this->ObsrName << "'s state is:" << this->ObsrState << endl;
};
};
#endif dCO
/ConcreteSubject.h
#ifndef dCS
#define dCS
#include "Subject.h"
#include <string>
using namespace std;
class ConcreteSubject : public Subject
{
private:
string subState;
public:
string getState() { return this->subState;};
void setState(string state){ this->subState = state;};
};
#endif dCS
/main.cpp
#include "ConcreteObserver.h"
#include "ConcreteSubject.h"
void main()
{
ConcreteSubject* cs = new ConcreteSubject();
ConcreteObserver* co1 = new ConcreteObserver(cs,"X");
ConcreteObserver* co2 = new ConcreteObserver(cs,"Y");
ConcreteObserver* co3 = new ConcreteObserver(cs,"Z");
cs->Attach(co1);
cs->Attach(co2);
cs->Attach(co3);
cs->setState("Hello!");
cs->Notify();
int a;
cin >> a;
}