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;
};
void Subject::Attach(Observer* o)
{
_observers->Append(o);
}
void Subject::Detach(Observer* o)
{
_observers->Remove(o);
}
void Subject::Notify()
{
ListIterator<Observer*> i(_observers);
for(i.First(); !i.IsDone(); i.Next())
{
i.CurrentItem()->Update(this);
}
}
ClockTimer 是一个用于储存和维护一天时间得具体目标。它每秒通知一次它的观察着
class ClockTimer : public Subject{
public:
ClockTimer();
virtual int GetHour();
virtual int GetMinute();
virtual int GetSecond();
void Tick();
};
void ClockTimer::Tick(){
Notify();
}
定义一个DigitalClock类来显示时间
class DigitalClock: public Widget, public Observer{
public:
DigitalClock(ClockTimer*);
virtual ~DigitalClock();
//overrides
virtual void Update(Subject*);
//overrides
virtual void Draw();
private:
ClockTimer* _subject;
}
DigitalClock::DigitalClock(Clocktimer* s)
{
_subject = s;
_subject->Attath(this);
}
DigitalClock::~DigitalClock()
{
_subject->Detach(this);
}
void DigitalClock::Update(Subject* theChangedSubject)
{
if(theChangedSubject == _subject)
Draw();
}
void DigitalClock::Draw()
{
}
一个AnalogClock 可用相同的方法定义。
class AnalogClock: public Widget, public Observer{
public:
AnalogClock(ClockTimer*);
virtual void Update(Subject*);
virtual void Draw();
///....
};
ClockTimer* timer = new ClockTimer;
AnalogClock* analogClock = new AnalogClock(timer);
DigitalClock* digitalClock = new DigitalClock(timer);