观察者模式定义了对象之间一对多依赖,这样一来,当一个对象改变状态时,它所有的依赖者都会收到通知并自动更新。
观察者模式类图(并非标准的UML):
ISubject为主题接口,对象利用此接口注册为观察者,或者把自己从观察者中删除。每个主题可以有多个IObserver观察者。
IObserver为观察者接口,所有潜在的观察者都必须实现此接口,该接口中只有一个update()方法,当主题状态改变时,该方法被调用。
Subject是一个具体主题,其总是实现主题接口,除了注册和撤销方法之外,具体主题还实现了notifyObservers()方法,此方法用于在主题状态改变时更新所有的观察者。
Observer1和Observer2都是具体观察者,它们可以是实现了IObserver接口的任意类。观察者必须注册到具体的主题中,以便接收更新。
观察者模式优缺点:
1、如果程序在后期维护时经常需要添加或者移除相关功能模块,可以使用观察者模式,工作量会很小,可维护性会非常好。(优点)
2、因为各个模块分散,后面的功能方法可能重叠之前的功能,导致数据错误,所以在使用时尽量多做一步注释或者整理好文档。(缺点)
观察者模式应用实例:
对于一个微信公众号,其会不定时发送一些消息,关注该公众号就可以收到消息,取消关注就不再收到消息。
Java内置的观察者模式:
Java内置的观察者模式有两种传送数据的方式:“推”和“拉”。
推:当主题状态改变时,主题会向所有的观察者推送数据。主题每更新一次状态都会向所有的观察者推送一次数据,但是并不是所有的观察者都需要此时的数据,这会造成资源浪费,也会使得主题负担较重。
拉:在观察者需要数据的时候会主动去主题那拉数据回来。降低了主题的负担,同时不会有数据的浪费,但是其及时性有所欠缺。