推荐答案
观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。在 Java 中,观察者模式通常通过 java.util.Observable 类和 java.util.Observer 接口来实现。
示例代码
// www.javascriptcn.com code example
import java.util.Observable;
import java.util.Observer;
// 被观察者
class Subject extends Observable {
private String state;
public void setState(String state) {
this.state = state;
setChanged(); // 标记状态已改变
notifyObservers(state); // 通知所有观察者
}
public String getState() {
return state;
}
}
// 观察者
class ConcreteObserver implements Observer {
private String observerState;
@Override
public void update(Observable o, Object arg) {
this.observerState = (String) arg;
System.out.println("Observer state updated to: " + observerState);
}
}
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
ConcreteObserver observer = new ConcreteObserver();
subject.addObserver(observer); // 注册观察者
subject.setState("New State"); // 改变状态,触发通知
}
}本题详细解读
观察者模式的核心概念
- Subject(被观察者):维护一个观察者列表,并提供注册和删除观察者的方法。当状态发生变化时,通知所有注册的观察者。
- Observer(观察者):定义一个更新接口,当被观察者状态发生变化时,观察者会收到通知并执行相应的操作。
观察者模式的优点
- 解耦:观察者模式将观察者和被观察者解耦,使得它们可以独立变化。
- 灵活性:可以在运行时动态添加或删除观察者,而不影响被观察者或其他观察者。
- 一致性:确保所有观察者在被观察者状态变化时都能得到通知并更新。
观察者模式的缺点
- 性能问题:如果观察者数量过多,通知所有观察者可能会导致性能问题。
- 内存泄漏:如果观察者没有正确地从被观察者中移除,可能会导致内存泄漏。
适用场景
- 当一个对象的改变需要同时改变其他对象,且不知道具体有多少对象需要改变时。
- 当一个对象必须通知其他对象,但又不希望这些对象紧密耦合时。
Java 中的实现
在 Java 中,java.util.Observable 类和 java.util.Observer 接口提供了观察者模式的基本实现。Observable 类是被观察者,Observer 接口是观察者。通过继承 Observable 类并实现 Observer 接口,可以轻松实现观察者模式。
注意事项
- 从 Java 9 开始,
Observable类和Observer接口已被标记为过时(deprecated),建议使用java.beans.PropertyChangeListener或其他自定义实现来替代。 - 在实际开发中,观察者模式常用于事件处理系统、GUI 框架、消息队列等场景。