《观察者模式例子》由会员分享,可在线阅读,更多相关《观察者模式例子(5页珍藏版)》请在金锄头文库上搜索。
1、用观察者模式例子:多种数字钟的一致显示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
2、();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.Cur
3、rentItem()-Update(this); 向歹U表中的所有观察者发修改消息/ClockTimer提供了一个接口用于取出单个的时间单位如小时,分钟和秒。class ClockTimer : public Subject 定义记忆和维护时间的具体目标类 public:ClockTimer();virtual int GetHour();virtual int GetMinute();virtual int GetSecond();void Tick(););void ClockTimer:Tick ()更新ClockTimer的内部状态的一些操作/Notify();)/class Digi
4、talClock: 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) _subjec
5、t = 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
6、-GetMinute();/绘制数字钟)/class AnalogClock : public Widget, public Observer 用相同的方式定义不同的钟 public:AnalogClock(ClockTimer*)virtual void Update(Subject*);virtual void Draw(););这样,可以创建一个AnalogClock和一个Dig让alClock ,它们总是显示相同时间:ClockTimer* timer = new ClockTimer;AnalogClock* analogClock = new AnalogClock(timer);DigitalClock* digitalClock = new digitalClock(timer);