The Observer Pattern defines a one-to-many dependency between objects so that when one object changes state,all of its dependents are notified and updated automatically.
The Observer Pattern provides an object design where subjects and observers are loosely coupled.
原因:
Subjects只需要知道observer是实现自Observer接口。
我们可以在任何时候添加新的observer,因为Subjects只需要知道Observer接口,当然,我们也可以在任何时候修改和删除observer,而不需要对subject作任何的改动。
同样,修改subject和observer的任何一方都不会影响另一方的使用,它们可以各自被独立的复用
Design Principle:Strive for loosely coupled designs between objects that interact。
Loosely coupled designs allows us to build flexible OO systems that can handle change because they minimize the interdependency between objects.
观察者模式分为两个部分subject和observer,某一个具体subject可以和多个具体的observer想关联,当subject的状态发生变化时,则自动通知其所关联的所有observer。对于subject而言,它并不需要了解关于observer太多,只需要知道它们的实现的接口就可以,在subject中使用到observer实例变量,用于在其状态变化时调用observer的方法更新。对于observer也同样不需要了解subject太多,其也有subject接口的实例变量,但是在程序运行实现时,需要知道observer所要注册到的具体的subject对象,以便于该subject对象的状态发生变化时通知该observer。
观察者模式适用于某一个对象的全部或部分信息需要被其他未知的对象使用,并需要在该信息发生变化时及时更新信息。在该书中,则是举了天气数据的例子,该数据包含了温度、湿度等,可用于直接的温度、湿度显示,也可用于天气预报的数据来源,这样当天气数据发生变化时,则需要同时更新数据显示,以及利用了该数据的天气预报,所以,天气数据是具体的subject,温度、湿度、预报结果是具体的observer,当然该书中,天气数据是在一起用的,而没有具体单独的去用温度和湿度数据,否则对subject还需要细化。
Java内建了对实现观察者模式的接口支持,subject需要继承Observable,observer需要实现Observer,但是在使用上有一些不同,也有些缺陷。