:C++デザインモードのObserver(観察者)モードhttp://www.cnblogs.com/chain2012/archive/2011/01/24/1943322.html

25011 ワード

作用:オブジェクト間の1対以上の依存関係を定義し、オブジェクトの状態が変化すると、そのオブジェクトに依存するすべてのオブジェクトが通知され、自動的に更新されます.例えば、QQの中であなたの友達はオンラインして、彼らの顔は見せ始めて、消します. 以下は参照コードです.

   
     
#include < Windows.h >
#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 :
std::list
< Observer *> * _observers;
};

void Subject::Attach(Observer * obj)
{
_observers
-> push_back(obj);
}

void Subject::Detach(Observer * obj)
{
typedef std::list
< Observer *> ::iterator LI;
for (LI iter = _observers -> begin();
iter
!= _observers -> end();
++ iter)
{
if ( * iter == obj)
{
_observers
-> erase(iter);
break ;
}
}
}

void Subject::Notify()
{
typedef std::list
< Observer *> ::iterator LI;
std::list
< Observer *> * i(_observers);
for (LI it = i -> begin(); it != i -> end(); ++ it)
{
(
* it) -> Update( this );
}
}

// ClockTimer 。 。
class ClockTimer : public Subject {
public :
ClockTimer();
virtual int GetHour();
virtual int GetMinute();
virtual int GetSecond();

void Tick();
};

void ClockTimer::Tick()
{
Sleep(
1000 );
Notify();
}


class Widget;
// DigitalClock 。Widget
class DigitalClock : public Widget, public Observer {
public :
DigitalClock(ClockTimer
* );
virtual ~ DigitalClock();

virtual void Update(Subject * ); // overrides Observer operation

virtual void Draw(); // overrides Widget operation
private :
ClockTimer
* _subject;
};

DigitalClock::DigitalClock(ClockTimer
* time)
{
_subject
= time;
_subject
-> Attach( this );
}

DigitalClock::
~ DigitalClock()
{
_subject
-> Detach( this );
}

void DigitalClock::Update(Subject * theChangeSubject)
{
if (theChangeSubject == _subject)
{
Draw();
}
}

void DigitalClock::Draw()
{
int hour = _subject -> GetHour();
int minute = _subject -> GetMinute();
int second = _subject -> GetSecond();

// draw the digital clock;
}



int main()
{
ClockTimer
* timer = new ClockTimer;
DigitalClock
* digitalClock = new DigitalClock(timer);
}