观察者模式

我们先看看报纸和杂志的订阅是怎么一回事。

(1)报社的业务就是出版报纸
(2)只要你向报社订阅报纸,你就会一直收到新报纸
(3)当你不想再看报纸时,你可以取消订阅,他们就会停止向你送新报纸
(4)只要报社没有倒闭,就会一直有人向他们订阅或取消订阅报纸

所以出版者+订阅者 = 观察者模式

在观察者模式中,出版者被叫做“主题(Subject)”,订阅者被叫做“观察者(Observer)”。

当主题对象内的数据改变时就会通知观察者。观察者因为订阅(注册)了主题,所以它能够收到更新。

观察者模式的定义

定义了对象之间的一对多依赖。当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
观察者模式
观察者模式提供了一种对象设计,让主题和观察者之间松耦合。因为主题只知道观察者实现了某个接口(如上面的Observer接口)。主题不需要知道观察者的具体类是谁、做了什么或其他任何细节。
任何时候我们都可以增加新的观察者。因为主题唯一依赖的东西是一个实现Observer接口的对象列表,所以我们随时可以增加观察者,也可以在任何时候删除某些观察者。

即使有新类型的观察者出现时,主题的代码也不需要改变。我们只需要在观察者中实现了观察者接口(Observer接口)即可。改变主题或观察者其中一方,并不会影响另一方,因为两者是松耦合的,所以只要他们之间的接口仍被遵守,我们就可以*地改变他们。

如果将一个对象变成观察者呢?其实很简单,就是实现观察者接口,如上述的Observer接口,然后注册到主题对象中。

我在GitHub分享了观察者模式的demo代码,欢迎下载!
分享出来的代码里,主题对象会在状态发生变化时,将数据主动“推送(push)”给观察者。但是有时候,观察者只需要一部分数据,并不需要所有的,那么怎办呢?其实方法很简单。当主题对象中的状态发生变化时,主题对象就通知观察者们,说”hi,状态变化了,快去拿你们各自需要的最新数据吧“,然后观察者们就会自己来“拉取(pull)“数据。关于这部分demo代码也上传到GitHub上了,欢迎下载