观察者模式例子

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用观察者模式例子:多种数字钟的一致显示

class Observer { //定义一个抽象的观察者类Observer接口:public:

virtual ~Observer();

virtual void Update (Subject* thechangedSubject) = 0;

protected:

Observer() ;

};

//---------------------------------------------------------------------------------------------------- class Subject { //定义抽象目标类Subject接口:

public:

virtual ~Subject();

virtual void Attach(Observer*);

virtual void Detach(Observer*);

virtual void Notify();

protected:

Subject () ;

Private:

List *_observers; //观察者指针列表

};

void Subject :: Attach (Observer* o) { //观察者注册方法

_observers->Append (o);

}

void Subject :: Detach (Observer* o) { //观察者注销方法

_observers->Remove (o);

}

void Subject :: Notify () { //通知方法

ListIterator 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 () {

//更新ClockTimer的内部状态的一些操作

//……

Notify();

}

//---------------------------------------------------------------------------------------------------- class DigitalClock: public Widget, public Observer {

// 定义DigitalClock显示的数字钟类

//其中的Widget类提供操作界面方法pubic:

DigitalClock(ClockTimer*);

virtual ~DigitalClock();

virtual void Update(Subject*); //重载Update()

virtual void Draw(); //重载Draw(),具体绘制数字钟的方法

private:

ClockTimer* _subject;

};

DigitalClock :: DigitalClock (ClockTimer* s) {

_subject = s;

_subject->Attach(this); //作为观察者,注册该数字钟到具体目标

}

DigitalClock :: ~DigitalClock () {

_subject->Detach(this);

}

void DigitalClock ::Update (Subject* theChangedSubject){

if (theChangedSubject == _subject) { //确认发通知的目标是该时钟的目标Draw();

}

}

void DigitalClock :: Draw() {

int hour = _subject->GetHOur(); //从目标对象获得新时间值

int minute = _subject->GetMinute();

// ……

//绘制数字钟

}

//---------------------------------------------------------------------------------------------------- class AnalogClock : public Widget, public Observer { //用相同的方式定义不同的钟public:

AnalogClock(ClockTimer*)

virtual void Update(Subject*);

virtual void Draw();

相关文档
最新文档