观察者模式最为经典的例子就是 拍卖商品,(还有多个数据展示使用相同的数据源的例子)
大的概念大家似乎都知道,可是自己做,自己使用这个模式应用到程序中的时候总是感觉下不了手, 这两天刚好有个例子我们来从头到尾的再看一边这个模式的应用:
需求: 在WinForm1中改变了图片,希望在WinForm2的图片也进行刷新 。
分析 这是典型的可以用观察者模式的案例
1. 多个观察者需要关注同一个物品。
比如竞拍者们需要一个花瓶; 数据柱状图,数据饼装图需要关注同一个数据源。
那么这里同样WinForm1和WinForm2要同时关注图片。
2. 那么作为被关注的东东,它有能力注册,撤销 关注者。
也就是被拍卖的物品肯定要知道都有多少竞拍者,数据源要了解到绑定它的都有那些数据展示控件,这样当将来状态改变的时候我们就可以轻松的通知所有的注册者
于是就有了这样的基类(被关注的主题)

- attach就是注册观察者
- dettach(例子代码我用的是Detach)就是删除注册者
- notify是用来通知所有的注册者
getState 和 setState是用来设置获取主题状态的
下图是rose 里GOF给的标准的Observer Pattern ,有很多介绍模式的书会把Subject_Observer定义为抽象类, 其实这个时候我更推荐使用接口,毕竟开发中很少有具体的观察者还是独立的(或者说是非子类的),而Subject_Observer接口可以为子类提供多重继承的机会。Subject_ConcreteObserver_A就是具体的观察者,因为继承Subject_Observer接口,所以必须实现update方法,也就是当观察对象发生变化后会通过notify方法来通知到每一个观察者,而具体的观察者是通过update来更新各自的状态的。

下图是根据需求得到例子的类关系图,F1,F2 就是具体的观察者TUIImageSubject是被观察的对象。当F1改变
TUIImageSubject的时候 , F2会被通知到而且更新在在其中的显示。

其他的代码大家可以下载去看 , 观察者模式是比较简单的而且应用广泛的,但在做开发的时候经常会忽视,经常出现:
F1.update();
F2.update();
...
然后在所有要用到的地方复制粘贴,其实这样做 将来的维护和扩展都会非常令人抓狂~,所以遇到这样的 经典需求的时候 ,不如联想到 Observer Pattern ^_^