什么是观察者模式
观察者模式(Observer Pattern) 是一种设计模式,它定义了一种一对多的关系,让多个观察者对象能够同时监听一个主题对象。当主题对象的状态发生变化时,会通知所有观察者对象,使它们能够作出相应的更新。在java.swing和Spring框架中应用广泛。
主要部分
-
主题(Subject):又称被观察者(Observable),它是一个能够被观察的对象。在它的内部维护着观察者列表,并提供添加、删除观察者的方法。当主题对象的状态发生变化时,会通知所有观察者对象。
-
观察者(Observer):观察者是一个监听主题对象状态变化的对象。它包含一个更新方法,当主题对象的状态发生变化时,这个方法会被调用,进行相应的处理。
举个例子
- 定义一个主题接口
Subject
,包括添加、删除观察者和通知观察者的方法。 - 定义一个观察者接口
Observer
,包括更新方法update()
。 - 创建一个具体的主题类
ConcreteSubject
实现Subject
接口,维护观察者列表,并在状态变化时通知所有观察者。 - 创建一个具体的观察者类
ConcreteObserver
实现Observer
接口,并在update()
方法中进行相应的处理。 - 测试观察者模式。
java
import java.util.ArrayList;
import java.util.List;
// 1. 主题接口
interface Subject {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 2. 观察者接口
interface Observer {
void update(String state);
}
// 3. 具体的主题类
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private String state;
// 添加观察者
public void addObserver(Observer observer) {
observers.add(observer);
}
// 删除观察者
public void removeObserver(Observer observer) {
observers.remove(observer);
}
// 通知所有观察者
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
// 设置状态并通知观察者
public void setState(String newState) {
this.state = newState;
notifyObservers();
}
}
// 4. 具体的观察者类
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
// 更新方法
@Override
public void update(String state) {
System.out.println(name + " received update: " + state);
}
}
// 5. 测试观察者模式
public class ObserverPatternExample {
public static void main(String[] args) {
// 创建主题
ConcreteSubject subject = new ConcreteSubject();
// 创建观察者
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
// 将观察者添加到主题中
subject.addObserver(observer1);
subject.addObserver(observer2);
// 改变主题状态并通知观察者
subject.setState("State A");
subject.setState("State B");
}
}
ConcreteSubject
类是具体的主题类,它维护了观察者列表,并在状态发生变化时通过 notifyObservers()
方法通知所有观察者。ConcreteObserver
类是具体的观察者类,它在 update()
方法中实现了对状态变化的处理逻辑。在测试部分,我们创建了一个主题对象 subject
和两个观察者对象 observer1
和 observer2
,然后将观察者添加到主题中。当主题的状态发生变化时,观察者会接收到通知并进行处理。