观察者模式是软件设计模式中的一种行为模式,它在Java设计模式中占据着重要的地位。这种模式基于一种一对多的关系,使得一个主题对象能够维护一个或多个观察者对象的列表,当主题对象的状态发生改变时,它会自动通知所有的观察者进行相应的更新。
在Java中实现观察者模式,我们可以定义两个主要的角色:观察者(Observer)和被观察者(BeenObserved)。观察者接口(Observer)通常包含一个`update`方法,这个方法会在被观察者状态改变时被调用,以便观察者接收到变化的通知。被观察者接口(BeenObserved)则包含添加、移除观察者以及通知所有观察者的方法,如`addObserver`、`removeObserver`和`notifyObservers`。
在给定的例子中,`ConcreteWatched`类实现了`BeenObserved`接口,作为具体的被观察者。它维护了一个`Observer`类型的列表,并提供了添加、移除观察者以及通知观察者的方法。`SpecificWatcher`类实现了`Observer`接口,作为具体的观察者,其`update`方法在接收到被观察者的通知后执行特定的操作。
测试代码中,我们创建了一个`ConcreteWatched`实例(bObs),然后添加了三个`SpecificWatcher`实例作为观察者。通过调用`notifyObservers`方法,被观察者向所有观察者发送通知,打印出“***收到了通知***”。之后,移除一个观察者,再次通知时,只通知剩下的观察者,打印出“***少了一个观察者***”。
观察者模式在实际开发中有着广泛的应用,例如事件驱动编程、发布/订阅系统、数据绑定等场景。它使得代码具有更好的解耦性,提高了系统的灵活性和可扩展性。当一个对象的状态发生改变时,无需关心哪些对象依赖于它,只需通知观察者即可,这极大地简化了系统的复杂度。然而,也需要注意的是,如果观察者数量过多或者通知过程过于频繁,可能会导致性能问题,因此在使用时需要权衡利弊。