#include <iostream>
#include <list>
using namespace std;
class Subject;
class Observer {
public:
virtual ~Observer(){}
virtual void Update(Subject* theChangedSubject) = 0;
protected:
Observer(){}
};
class Subject {
public:
virtual ~Subject(){}
virtual void Attach(Observer*);
virtual void Detach(Observer*);
virtual void Notify();
protected:
Subject(){}
private:
list<Observer*> _observers;
public:
typedef list<Observer*>::iterator iterator;
};
void Subject::Attach(Observer* o) {
_observers.push_back(o);
}
void Subject::Detach(Observer* o) {
_observers.remove(o);
}
void Subject::Notify() {
iterator itr = _observers.begin();
while (itr != _observers.end())
{
(*itr)->Update(this);
++itr;
}
}
//concrete Subject
class ClockTimer : public Subject {
public:
ClockTimer(){}
// virtual int GetHour();
// virtual int GetMinute();
// virtual int GetSecond();
void Tick();
};
void ClockTimer::Tick() {
Notify(); // call Notify of Subject
}
//concrete Observer1
class DigitalClock : public Observer {
public:
DigitalClock(ClockTimer*);
// virtual ~DigitalClock();
virtual void Update(Subject *); //overrides Observer operation
virtual void Draw();
private:
ClockTimer* _subject;
};
DigitalClock::DigitalClock(ClockTimer* s) {
_subject = s;
_subject->Attach(this);
}
void DigitalClock::Update(Subject * theChangedSubject) {
if (theChangedSubject == _subject)
{
Draw();
}
}
void DigitalClock::Draw() {
cout << "DigitalClock Draw" << endl;
}
//concrete Observer2
class AnalogClock : public Observer {
public:
AnalogClock(ClockTimer*);
virtual void Update(Subject *);
virtual void Draw();
private:
ClockTimer * _subject;
};
AnalogClock::AnalogClock(ClockTimer *s) {
_subject = s;
_subject->Attach(this);
}
void AnalogClock::Update(Subject *theChangedSubject) {
if (theChangedSubject == _subject)
Draw();
}
void AnalogClock::Draw() {
cout << "AnalogClock Draw" << endl;
}
int
main()
{
ClockTimer *timer = new ClockTimer; //concrete subject;
AnalogClock* analogClock = new AnalogClock(timer);
DigitalClock* digitalClock = new DigitalClock(timer);
timer->Tick();
delete timer;
delete analogClock;
delete digitalClock;
return 0;
}