研磨设计方式 之 观察者模式(Observer) 1——跟着cc学设计系列

研磨设计模式 之 观察者模式(Observer) 1——跟着cc学设计系列

12.1  场景问题

12.1.1  订阅报纸的过程

来考虑实际生活中订阅报纸的过程,这里简单总结了一下,订阅报纸的基本流程如下:

  • 首先按照自己的需要选择合适的报纸,具体的报刊杂志目录可以从邮局获取。
  • 选择好后,就到邮局去填写订阅单,同时交上所需的费用。

至此,就完成了报纸的订阅过程,接下去的就是耐心等候,报社会按照出报时间推出报纸,然后报纸会被送到每个订阅人的手里。

       画个图来描述上述过程,如图12.1所示:

 研磨设计方式 之 观察者模式(Observer) 1——跟着cc学设计系列

图12.1  订阅报纸的过程示意图

虽然看起来订阅者是直接跟邮局在打交道,但实际上,订阅者的订阅数据是会被邮局传递到报社的,当报社出版了报纸,报社会按照订阅信息把报纸交给邮局,然后由邮局来代为发送到订阅者的手中。所以在整个过程中,邮局只不过起到一个中转的作用,为了简单,我们去掉邮局,让订阅者直接和报社交互,如图12.2所示:

 研磨设计方式 之 观察者模式(Observer) 1——跟着cc学设计系列

图12.2  简化的订阅报纸过程示意图

12.1.2  订阅报纸的问题

       在上述过程中,订阅者在完成订阅后,最关心的问题就是何时能收到新出的报纸。幸好在现实生活中,报纸都是定期出版,这样发放到订阅者手中也基本上有一个大致的时间范围,差不多到时间了,订阅者就会看看邮箱,查收新的报纸。

要是报纸出版的时间不固定呢?

那订阅者就麻烦了,如果订阅者想要第一时间阅读到新报纸,恐怕只能天天守着邮箱了,这未免也太痛苦了吧。

继续引申一下,用类来描述上述的过程,描述如下:

订阅者类向出版者类订阅报纸,很明显不会只有一个订阅者订阅报纸,订阅者类可以有很多;当出版者类出版新报纸的时候,多个订阅者类如何知道呢?还有订阅者类如何得到新报纸的内容呢?

把上面的问题对比描述一下:

 研磨设计方式 之 观察者模式(Observer) 1——跟着cc学设计系列

       进一步抽象描述这个问题:当一个对象的状态发生改变的时候,如何让依赖于它的所有对象得到通知,并进行相应的处理呢?

       该如何解决这样的问题?