观察者模式(Observer Pattern)是软件设计模式的一种,属于行为型模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,观察者模式主要通过java.util.Observable和java.util.Observer接口来实现。
**观察者模式的核心概念:**
1. **主题(Subject)**:主题是被观察的对象,它可以是任何类型的对象,只要它可以发布状态变化的通知。在Java中,这个角色由`Observable`类扮演。
2. **观察者(Observer)**:观察者是对主题感兴趣的类,当主题状态改变时,观察者会收到通知并执行相应的操作。在Java中,`Observer`接口代表了观察者角色。
3. **添加观察者(registerObserver)**:主题提供方法让观察者注册自身,以便在状态改变时接收到通知。
4. **删除观察者(deleteObserver)**:主题允许移除不再关心状态变化的观察者。
5. **通知所有观察者(notifyObservers)**:当主题状态改变时,会调用此方法通知所有已注册的观察者。
**观察者模式的应用场景:**
- 当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变。
- 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。
- 当你想在对象之间建立一种一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知。
**Java中的实现:**
在Java中,`Observable`类是主题,它维护了一个观察者的列表。当你创建一个`Observable`实例,你可以通过`addObserver(Observer o)`方法添加观察者,通过`deleteObserver(Observer o)`方法删除观察者。当主题状态改变时,调用`setChanged()`方法标记状态已改变,然后调用`notifyObservers()`或`notifyObservers(Object arg)`通知所有观察者,参数`arg`可以传递额外的信息。
```java
import java.util.Observable;
import java.util.Observer;
public class Main {
public static void main(String[] args) {
// 创建主题
Observable observable = new Observable();
// 创建观察者
Observer observer1 = new ConcreteObserver1();
Observer observer2 = new ConcreteObserver2();
// 添加观察者
observable.addObserver(observer1);
observable.addObserver(observer2);
// 修改主题状态并通知观察者
observable.setChanged(); // 标记状态改变
observable.notifyObservers("状态已更新"); // 传递信息给观察者
}
}
class ConcreteObserver1 implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("观察者1收到通知:" + arg);
}
}
class ConcreteObserver2 implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("观察者2收到通知:" + arg);
}
}
```
以上代码展示了如何在Java中使用观察者模式。运行这段代码,两个观察者都将接收到状态更新的通知。
**总结:**
观察者模式是一种强大的设计模式,它使得系统更加灵活,降低了对象之间的耦合性。在实际开发中,观察者模式常用于事件处理、状态监听等场景。例如,GUI组件中的按钮点击事件处理、订阅发布系统、数据绑定框架等都是观察者模式的典型应用。理解并熟练运用观察者模式,有助于提升软件的可维护性和扩展性。