观察者模式
我们先看看报纸和杂志的订阅是怎么一回事。
(1)报社的业务就是出版报纸 |
(2)只要你向报社订阅报纸,你就会一直收到新报纸 |
(3)当你不想再看报纸时,你可以取消订阅,他们就会停止向你送新报纸 |
(4)只要报社没有倒闭,就会一直有人向他们订阅或取消订阅报纸 |
所以出版者+订阅者 = 观察者模式
在观察者模式中,出版者被叫做“主题(Subject)”,订阅者被叫做“观察者(Observer)”。
当主题对象内的数据改变时就会通知观察者。观察者因为订阅(注册)了主题,所以它能够收到更新。
观察者模式的定义
定义了对象之间的一对多依赖。当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
观察者模式提供了一种对象设计,让主题和观察者之间松耦合。因为主题只知道观察者实现了某个接口(如上面的Observer接口)。主题不需要知道观察者的具体类是谁、做了什么或其他任何细节。
任何时候我们都可以增加新的观察者。因为主题唯一依赖的东西是一个实现Observer接口的对象列表,所以我们随时可以增加观察者,也可以在任何时候删除某些观察者。
即使有新类型的观察者出现时,主题的代码也不需要改变。我们只需要在观察者中实现了观察者接口(Observer接口)即可。改变主题或观察者其中一方,并不会影响另一方,因为两者是松耦合的,所以只要他们之间的接口仍被遵守,我们就可以自由地改变他们。
如果将一个对象变成观察者呢?其实很简单,就是实现观察者接口,如上述的Observer接口,然后注册到主题对象中。
我在GitHub分享了观察者模式的demo代码,欢迎下载!
分享出来的代码里,主题对象会在状态发生变化时,将数据主动“推送(push)”给观察者。但是有时候,观察者只需要一部分数据,并不需要所有的,那么怎办呢?其实方法很简单。当主题对象中的状态发生变化时,主题对象就通知观察者们,说”hi,状态变化了,快去拿你们各自需要的最新数据吧“,然后观察者们就会自己来“拉取(pull)“数据。关于这部分demo代码也上传到GitHub上了,欢迎下载。
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/88555727
- 点赞
- 收藏
- 关注作者
评论(0)