: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);
}