观察者模式
就像订报纸一样,出版者+订阅者=观察者模式。
换个名称就是:主题对象+观察者=观察者模式。
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
模式为了交互对象之间的松耦合设计而努力。
java内置的观察者模式
java.util包(package)内包含最基本的Observer接口与Observable类,这和书中的Subject接口与Observer接口很相似。
可以使用推(push)或拉(pull)的方式传送数据。
主题可称为可观察者(Observable类)追踪所有的观察者,并通知他们。
具体的观察者有一个共同的Observer接口,提供了一个被主题调用的update()方法。
过程:
对象实现观察者接口(java.uitl.Observer),然后调用任何Observable对象的addObserver()方法。不想再当观察者时,调用deleteObserver()方法就可以了。
利用扩展java.util.Observable接口产生“可观察者”类。先调用setChanged()方法,标记状态已经改变的事实(好让notifyObservers()知道当它被调用时应该更新观察者。如果调用notifyObservers()之前没有先调用setChanged(),观察者就“不会”被通知)。然后调用两种notifyObservers()方法中的一个(传送给一个或者多个)。
观察者实现了更新的方法。如果你想“推”(push)数据给观察者,你可以把数据当作数据对象传送给notifyObservers(arg)方法。否则,观察者就必须从可观察者对象中“拉”(pull)数据。
观察者和可观察者之间用松耦合方式结合(loosecoupling),可观察者不知道观察者的细节,只知道观察者实现了观察者接口。
有多个观察者时,不可以依赖特定的通知次序。
多用组合,少用继承
观察者模式利用“组合”将许多观察者组合进主题中。对象之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式而产生的。
在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。这就叫提前规划。
就像订报纸一样,出版者+订阅者=观察者模式。
换个名称就是:主题对象+观察者=观察者模式。
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
模式为了交互对象之间的松耦合设计而努力。
java内置的观察者模式
java.util包(package)内包含最基本的Observer接口与Observable类,这和书中的Subject接口与Observer接口很相似。
可以使用推(push)或拉(pull)的方式传送数据。
主题可称为可观察者(Observable类)追踪所有的观察者,并通知他们。
具体的观察者有一个共同的Observer接口,提供了一个被主题调用的update()方法。
过程:
对象实现观察者接口(java.uitl.Observer),然后调用任何Observable对象的addObserver()方法。不想再当观察者时,调用deleteObserver()方法就可以了。
利用扩展java.util.Observable接口产生“可观察者”类。先调用setChanged()方法,标记状态已经改变的事实(好让notifyObservers()知道当它被调用时应该更新观察者。如果调用notifyObservers()之前没有先调用setChanged(),观察者就“不会”被通知)。然后调用两种notifyObservers()方法中的一个(传送给一个或者多个)。
观察者实现了更新的方法。如果你想“推”(push)数据给观察者,你可以把数据当作数据对象传送给notifyObservers(arg)方法。否则,观察者就必须从可观察者对象中“拉”(pull)数据。
观察者和可观察者之间用松耦合方式结合(loosecoupling),可观察者不知道观察者的细节,只知道观察者实现了观察者接口。
有多个观察者时,不可以依赖特定的通知次序。
多用组合,少用继承
观察者模式利用“组合”将许多观察者组合进主题中。对象之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式而产生的。
在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。这就叫提前规划。