场景
王大哥收到用户的需求,要做一套订阅系统,类似一个博主,多个粉丝那种。
于是王大哥扣了扣脑袋,想到了三个方法:
方案一:粉丝不断的get博主的状态,从而得到其更新的内容。
评价:fans需要不断的查询,对比更新前后内容。效率低
方案二:当博主更新时,博主会通知粉丝,粉丝自己来获得更新内容。
评价:fans需要随时关注来自博主的提示,来判断是否更新。本来是博主自己的事情,却需要两个人来做。
方案三:当博主更新时,博主会推送更新的内容给粉丝
评价:博主有新发布后,通知fans并调用fans的update(),实现了fans的自动更新。
方案三采用了观察者模式,做到了尽量解耦合,同时提高效率。
这时,王大哥又收到了新的需求:根据博主的信息,用户可以不看的相关的推送。按照方案三,只需要更改用户的设置即可。
总结
意图:在对象之间定义一种一对多的依赖关系,这样当一个对象的状态改变时,所有依赖者都将得到通知并自动更新。
问题:当某个事件发生时,需要向一系列变化着的对象发出通知。
解决方案:observer将监视某个事件的责任委托给中心对象:subject。
效果:如果某些observer只对事件的一个子集感兴趣,那么subject可能会告诉他们不需要知道的事情。
实现:
- 让某个事件发生时需要知道的对象将自己注册到另一个监视事件发生或者自己触发事件的对象上。
- 事件发生时,Subject告诉Observer事件已经发生。
- 为了对所有的Observer类型对象实现Observer接口,有时候需要使用Adapter模式。
当某件事情发生时,要向一系列变化的对象发出通知时,才最适用观察者。
某些观察者有的时候只需要处理一些固定的情况,那我们就可以配合strategy模式一起使用。
通过添加或者删除已经组合的对象,可以灵活的修改代码,而不需要去修改内部代码。