《《设计模式21》-观察者模式》由会员分享,可在线阅读,更多相关《《设计模式21》-观察者模式(11页珍藏版)》请在金锄头文库上搜索。
1、4.观察者模式(Observer Pattern)v又名:订阅-发布模式v例: 一个时钟模型,当时间改变时,通知各显示界面,如以数字形式显示,或以表盘形式显示。 观察者模式意图v多个对象间是一种一对多的关系;v当一个对象的状态改变时,所有依赖于它的对象都将得到通知,并自动更新;观察者模式结构观察者模式变体观察者模式效果v目标与观察者间解耦(只在抽象层耦合)v支持广播通信v不足:更新可能出现意外观察者模式的实现问题v目标与观察者间的关联管理可直接关联,也可将关联关系存入一个Map表中目标可以多个。即二者为多对多关系。v更新的触发例子代码class Subject;class Observerpu
2、blic: virtual Observer()(); virtual void Update(Subject * theChangedSubject) = 0;;class Subject public: Subject( ); virtual Subject( ); virtual void Atach(Observer * obj ) observers-Append(obj); virtual void Detach(Observer * obj) observers-Remove(obj); virtual void Notify() ListIterator i(observers
3、); for( i.First(); !i.IsDone();i.Next() i.CurrentItem()-Update(this); private: List * observers; ;/具体的目标类具体的目标类ClockTimerclass ClockTimer:public Subjectpublic: ClockTimer( ); virtual int GetHour(); virtual int GetMinute(); virtual int GetSecond(); void Tick() /记录当前时间记录当前时间 Notify();(); ;/具体的观察者类具体的观
4、察者类DigitalClockclass DigitalClock:public Observer public: DigitalClock(ClockTiemr * theSubject) subject = theSubject; subject-Attach(this); virtual DigitalClock()() subject-Detach(this); virtual void Update(Subject * theChangedSubject) if(theChangedSubject = subject) Draw(); virtual void Draw() int h= subject-GetHour(); int m = subject-GetMinute(); int s = subject-GetSecond(); /绘制时钟,略绘制时钟,略 private: ClockTimer * subject;;客户代码:客户代码:ClockTimer * timer = new ClockTimer;AnalogClock * analogClock = new AnalogClock(timer););DigitalClock * digitalClock = new DigitalClock(timer););