观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会收到通知并自动更新。
观察者模式,类图:
利用观察者模式,主题是具有状态的对象,并且可以控制这些状态。也就是说,有“一个”具有状态的主题。另一方面,观察者使用这些状态,虽然这些状态并不属于他们。有许多观察者,依赖主题来告诉他们状态何时改变了。这就产生一个关系:“一个”主题对“多个”观察者的关系。
当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。而观察者模式提供了一种对象设计,让主题和观察者之间松耦合。关于观察者的一切,主题只知道观察者实现了某个接口(也就是Observer接口)。主题不需要知道观察者的具体类是谁,做了些什么或其他任何细节。假如有个新的具体类需要当观察者,我们不需要为了兼容新类型而修改主题的代码,所有要做的就是在新的类里实现此观察者接口,然后注册为观察者即可。
观察者模式遵循的设计原则:
1.为了交互对象之间的松耦合涉及而努力。松耦合的设计之所以能让我们建立有弹性的面向对象系统,能够应对变化,是因为对象之间的互相依赖降到了最低。
2.找出程序中会变化的方面,然后将其和固定不变的方面相分离。在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。
3.针对接口编程,不针对实现编程。主题与观察者都是用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。这样可以让两者之间运作正常,又同时具有松耦合的优点。
4.多用组合,少用继承。观察者模式利用“组合”将许多观察者组合进主题中,对象之间的这种关系不是通过继承产生的,而是运行时利用组合的方式而产生的。
总结:
1.观察者模式定义了对象之间一对多的关系。
2.主题(也就是可观察者)用一个共同的接口来更新观察者。
3.观察者和可观察者之间用松耦合方式结合,可观察者不知道观察者细节,只知道观察者实现了观察者接口。
4.使用此模式时,你可以从被观察者处推(push)或拉(pull)数据(然而,推的方式被认为更“正确”)。
5.有多个观察者时,不可以依赖特定的通知次序。