资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,4.观察者模式(Observer Pattern),又名:订阅-发布模式,例:,一个时钟模型,当时间改变时,通知各显示界面,如以数字形式显示,或以表盘形式显示。,观察者模式意图,多个对象间是一种一对多的关系;,当一个对象的状态改变时,所有依赖于它的对象都将得到通知,并自动更新;,观察者模式结构,观察者模式变体,观察者模式效果,目标与观察者间解耦(只在抽象层耦合),支持广播通信,不足:更新可能出现意外,观察者模式的实现问题,目标与观察者间的关联管理,可直接关联,也可将关联关系存入一个Map表中,目标可以多个。即二者为多对多关系。,更新的触发,例子代码,class Subject;,class Observer,public:,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);,for(i.First();!i.IsDone();i.Next(),i.CurrentItem()-Update(this);,private:List*observers;,;,/具体的目标类ClockTimer,class ClockTimer:public Subject,public:,ClockTimer();,virtual int GetHour();,virtual int GetMinute();,virtual int GetSecond();,void Tick(),/记录当前时间,Notify();,;,/具体的观察者类DigitalClock,class 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);,
展开阅读全文