最后,我们可以编写一个简单的测试程序来演示观察者模式:
代码语言:javascript复制public class WeatherStation {
public static void main(String[] args) {
ConcreteSubject weatherData = new ConcreteSubject();
ConcreteObserver currentConditionsDisplay = new ConcreteObserver();
weatherData.registerObserver(currentConditionsDisplay);
weatherData.setMeasurements(80, 65, 30.4f);
weatherData.setMeasurements(82, 70, 29.2f);
weatherData.setMeasurements(78, 90, 29.2f);
}
}
运行测试程序后,可以看到如下输出:
代码语言:javascript复制Current conditions: 80.0F degrees and 65.0% humidity and 30.4Pa
Current conditions: 82.0F degrees and 70.0% humidity and 29.2Pa
Current conditions: 78.0F degrees and 90.0% humidity and 29.2Pa
这表明当气象数据发生变化时,观察者会自动收到通知并更新自己的状态。
观察者模式的优缺点
观察者模式的优点在于它可以实现对象之间的松耦合,主题对象和观察者对象之间的耦合度较低,可以相互独立地变化。这使得我们可以更加灵活地添加或删除观察者对象,也可以在不影响主题对象的情况下添加新的观察者对象。
另外,观察者模式还可以支持广播通信,当一个主题对象发生变化时,它的所有观察者对象都会收到通知,并且可以自动更新自己的状态。这种广播通信模式可以减少对象之间的相互依赖,从而使代码更加清晰、简洁。
观察者模式的缺点在于,如果观察者对象太多,会导致主题对象通知所有观察者对象的时间变长,从而影响程序的性能。另外,如果观察者对象之间有循环依赖的情况,可能会导致死循环,从而使程序崩溃。