基于设计模式的学习之旅-----观察者模式(附源码)

          基于设计模式的学习之旅-----观察者模式

1、初始观察者模式

在网络还不是那么发达的年代,很多人想了解隔天的天气预报都是得在规定时间去看电视直播,但是有时想关注天气的时候发现电视直播已经过了。这真是一件让人很不爽的事情啊。

基于这种情况,移动推出了“预定查询天气预报”业务。手机用户告诉移动他关心第二天的天气情况,订阅了天气通知的业务。当移动收到气象站告知的天气情况时,就会发送给所有订阅了这个服务的用户。 这样用户就不用为天气情况头疼了。

2什么是观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。

别名:依赖(Dependents), 发布-订阅( P u b l i s h - S u b s c r i b e )

3模式结构图

基于设计模式的学习之旅-----观察者模式(附源码)_第1张图片

4模式代码事例

4.1 涉及到相关的类

AbstractObsever(抽象观察者)AbstractSubject(抽象目标)MNOWeatherSubject(移动气象站服务目标)MobileUserObsever(移动用户)WeatherStation(气象站)

4.2具体代码实现

AbstractObsever

基于设计模式的学习之旅-----观察者模式(附源码)_第2张图片

 

AbstractSubject

基于设计模式的学习之旅-----观察者模式(附源码)_第3张图片

 

MNOWeatherSubject

基于设计模式的学习之旅-----观察者模式(附源码)_第4张图片

 

MobileUserObsever

基于设计模式的学习之旅-----观察者模式(附源码)_第5张图片

 

WeatherStation

基于设计模式的学习之旅-----观察者模式(附源码)_第6张图片

 

PatternRun

基于设计模式的学习之旅-----观察者模式(附源码)_第7张图片

4.3 事例输出结果

基于设计模式的学习之旅-----观察者模式(附源码)_第8张图片

5、模式参与者

目标:AbstractSubjectMNOWeatherSubject

观察者:AbstractObseverMobileUserObsever

6模式优缺点

A目标和观察者间的抽象耦合

一个目标所知道的仅仅是它有一系列观察者 每个都符合抽象的O b s e r v e r类的简单接口。目标不知道任何一个观察者属于哪一个具体的类。这样目标和观察者之间的耦合是抽象的和最小的

 

B支持广播通信

不像通常的请求目标发送的通知不需指定它的接收者。通知被自动广播给所有已向该目标对象登记的有关对象。目标对象并不关心到底有多少对象对自己感兴趣 ;它唯一的责任就是通知它的各观察者。这给了你在任何时刻增加和删除观察者的自由。处理还是忽略一个通知取决于观察者

 

C意外的更新

因为一个观察者并不知道其它观察者的存在 它可能对改变目标的最终代价一无所知。在目标上一个看似无害的的操作可能会引起一系列对观察者以及依赖于这些观察者的那些对象的更新。此外 如果依赖准则的定义或维护不当,常常会引起错误的更新 这种错误通常很难捕捉

7模式适用性

A、当一个抽象模型有两个方面其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

 

B、当对一个对象的改变需要同时改变其它对象 而不知道具体有多少对象有待改变。

 

C、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之 你不希望这些对象是紧密耦合的

 

点击下载“文档以及源码下载”

 

欢迎转载,请注明出处“http://www.cnblogs.com/luxiaofeng54/archive/2013/04/10/3012822.html”

 

 

 

你可能感兴趣的:(基于设计模式的学习之旅-----观察者模式(附源码))