观察者模式的一个例子


观察者模式最为经典的例子就是 拍卖商品,(还有多个数据展示使用相同的数据源的例子)

大的概念大家似乎都知道,可是自己做,自己使用这个模式应用到程序中的时候总是感觉下不了手, 这两天刚好有个例子我们来从头到尾的再看一边这个模式的应用:

需求: WinForm1中改变了图片,希望在WinForm2的图片也进行刷新

分析 这是典型的可以用观察者模式的案例

1.       多个观察者需要关注同一个物品。

 比如竞拍者们需要一个花瓶; 数据柱状图,数据饼装图需要关注同一个数据源。

那么这里同样WinForm1WinForm2要同时关注图片。

 

2.       那么作为被关注的东东,它有能力注册,撤销 关注者。

也就是被拍卖的物品肯定要知道都有多少竞拍者,数据源要了解到绑定它的都有那些数据展示控件,这样当将来状态改变的时候我们就可以轻松的通知所有的注册者

 

于是就有了这样的基类(被关注的主题)

http://www.cbf107.com/images/Observer20070427_1.gif

 

  • attach就是注册观察者
  • dettach例子代码我用的是Detach就是删除注册者
  • notify是用来通知所有的注册者

 
         getState
setState是用来设置获取主题状态的

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

        http://www.cbf107.com/images/Observer20070427_2.gif

下图是根据需求得到例子的类关系图,F1,F2 就是具体的观察者TUIImageSubject是被观察的对象。当F1改变

TUIImageSubject的时候 , F2会被通知到而且更新在在其中的显示。

 

http://www.cbf107.com/images/Observer20070427_3.gif

 

其他的代码大家可以下载去看 , 观察者模式是比较简单的而且应用广泛的,但在做开发的时候经常会忽视,经常出现:

F1.update();

F2.update();

...

然后在所有要用到的地方复制粘贴,其实这样做 将来的维护和扩展都会非常令人抓狂~,所以遇到这样的 经典需求的时候 ,不如联想到 Observer Pattern ^_^

[附件下载]
cbf1072018/5/30 11:13:55
......核心就是 1.注册​登记 2.按照登记通知
大师兄2018/5/29 14:39:36
不会啊
大师兄2018/5/29 14:39:31
不会啊
cbf1072018/5/1 13:44:57
这个没有下载内容~
清华大学2018/4/15 20:07:43
怎么下载,求解
清华大学2018/4/15 20:07:42
怎么下载,求解
清华大学2018/4/15 20:07:37
怎么下载,求解
试试2013/7/5 11:08:08
都是
cbf1072007/4/29 9:25:30
嘿嘿,不客气~
师兄2007/4/27 18:15:45
谢谢,要的就是这个.哈哈.
cbf1072007/4/27 18:09:13
例子代码是用vb.net,大家可以用C# Java去实践
访客: