观察者模式.pdf
1 目录 1.观察者模式(Observer Pattern).2 2.命令模式(Observer Pattern).6 2 1.观察者模式(Observer Pattern)1.1.描述:模式的定义和简单的具体描述 观察者模式定义了对象之间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新。观察者模式中关键的对象是目标(Subject)和观察着(observer)。一个目标可以有任意数目的依赖它的观察者。一旦目标的状态发生改变,所有的观察者都得到通知。作为对这个通知的响应,每个观察者都查询目标以使其状态与目标状态同步。1.2.类图:模式的类图以及类图中每个类的说明 Subject(目标):定义了 Suject 的接口,一般使用抽象类(C+)或者接口(JAVA)的方式实现。其中包含三个方法:Attach 方法用于加入 Observer,Dettach 的方法用于移除 Observer,Notify方法用于通知 Observer。Observer(观察者):3 定义了 Observer 的接口,与 Suject 类似,一般使用抽象类(C+)或者接口(JAVA)的方式实现。Update 方法用于更新 Observer 的显示。ConcreteSubject(具体目标):继承 Suject 抽象类(C+)或者实现了 Suject 接口(JAVA)的具体 Suject 类,负责保存注册的 Observer 以及在自身状态发生改变时通知 Observer 的具体实现。ConcreteObserver(具体观察者):继承 Observer 抽象类(C+)或者实现了 Observer 接口(JAVA)的具体 Observer类。保存所依赖的 Suject 对象的引用,并通过更新的方式保证自身的状态和所依赖的 Suject状态一致。1.3.实现演示代码:C+和 Java 都可以 简介:使用 Observer 模式实现以多种方式表示时间。4 Subject 抽象类 Observer 纯虚类 class Observer;class Subject public:virtual Subject();virtual void Attach(Observer *);virtual void Detach(Observer*);virtual void Notify();project:Subject();private:List _observer_list;void Subject:Attach(Observer*o)_observer_list.Append(o);void Subject:Detach(Observer*o)_observer_list.Remove(o);void Subject:Notify()List:iterator ite=_observer_list.begin(),ite_end=_observer_list.end();for(;ite!=ite_end;ite+)(*ite)-update(this);class Subject;class Observer public:virtual Observer();virtual void Update(Subject*)=0;project:Observer();5 保存时间信息的 ClockSuject 类。Tick 方法由一个内部的计时器每隔一段时间(比如 1s)进行调用。Tick 方法随后更新时钟信息并且调用 notify 通知调用者。接着定义使用两种不同格式定义时间的 Clock 类。SImpleClock 使用 24 小时制的方式(HH:MM:SS)显示时间,GuiClock 一种使用图形化时钟方式显示时间。SimpleClock 类 class ClockSuject:public Subject public:ClockSuject();virtual int getHour();virtual int getMin();virtual int getSec();void Tick();/call by a internal clock every second.Void ClockSuject:Tick()/update internal time-keeping state /this-update();class SimpleClock:public Observer public:SimpleClock(ClockSubject*cs):_cs(cs);virtual SimpleClock();virtual void Upate(Subject *);private:ClockSubject*_cs;void SimpleClock:Upate(Subject *s)if(_cs=s)printf(“%d:%d:%d”,_cs-getHour(),_cs-getMin(),_cs-getSec();6 GuiClock 类 1.4.目前存在的应用:举几个例子,目前在什么地方运用到了这个模式 Observer 的优点在于 Subject 和 Oberserver 的解耦合,是一种定向广播的更新模式,也是一种事件驱动的设计模式。Observer 模式在 JAVA 的图形实现(AWT,Swing)中都有非常重要的地位,其图形事件驱动的模式本质上也是一个 Observer Pattern 的应用。XML 解析中的 SAX 模式也使用了 Observer Pattern 来实现。首先注册一种类似回调函数(Observer),随后遇到某个 XML 标签或者获取其他信息时(Subject),进行调用并处理。MVC 的中也包含了一部分的 Observer Pattern 的实现。2.命令模式(Observer Pattern)一直把 23 个模都说明完毕,最后更新目录 class GuiClock:public Observer,public GUI public:GuiClock(ClockSubject*cs):_cs(cs);virtual GuiClock();virtual void Upate(Subject *);virtual void draw();/function to draw a clock;private:ClockSubject*_cs;void GuiClock:Upate(Subject *s)if(_cs=s)draw();