Posted on 2008-05-16 02:38
Herbert 阅读(370)
评论(0) 编辑 收藏 引用 所属分类:
设计模式
Observer (观察者)模式就是指一个被观察对象对应多个观察对象,当这个被观察对象状态改变时可以立即通知所有依赖于该对象的观察对象。
举个例子:
假如我要设计一个按钮响应事件,当我按下按钮时,在另外一个地方有个标签上显示“已经按了”。
最直接的想法是在按钮类Button 里面创建一个标签类的指针(如: Label* m_pLabel), 当按钮按下时, 在按钮的响应事件里面调用 m_pLabel, 使得它显示 “已经按了”。
但这种做法只能局限于具体的两个类:Button 和 Label, 如果我要Button 通知 Button或者其它类,则要再添加一个指向其它类的指针,这样显得很不整洁。观察模式就可以解决这个问题,如下图所示:
创建两个基类: Informer (被观察类) 和 Observer (观察类)。
在Informer 里面有一个Observer对象的列表, 当Informer的状态发生改变时,调用notify()方法,该方法的作用是遍历Observer列表,并调用它们的 update(Informer*) 方法,使得该Informer对象对应的所有Observer对象都进行更新。当我们有一个类B要观察类A的时候,就把
B 和 A 分别继承于 Observer 和 Informer 。这样,当A的属性发生变化时,调用notify()方法,就可以调用到B的update()方法,从而达到通知的效果。
注意:
假设update()里面有个 Informer* pInfo的参数,不要为了方便,把pInfo 转换成 Informer 的子类的指针,否则很容易使pInfo指针出错。