观察者模式例子
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
};
void Subject :: Attach (Observer* o) { //观察者注册方法
_observers->Append (o);
}
void Subject :: Detach (Observer* o) { //观察者注销方法
_observers->Remove (o);
}
void Subject :: Notify () { //通知方法
ListIterator
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();