什么是观察者模式
观察者模式(Observer Pattern) 是一种设计模式,它定义了一种一对多的关系,让多个观察者对象能够同时监听一个主题对象。当主题对象的状态发生变化时,会通知所有观察者对象,使它们能够作出相应的更新。在java.swing和Spring框架中应用广泛。
主要部分
-
主题(Subject):又称被观察者(Observable),它是一个能够被观察的对象。在它的内部维护着观察者列表,并提供添加、删除观察者的方法。当主题对象的状态发生变化时,会通知所有观察者对象。
-
观察者(Observer):观察者是一个监听主题对象状态变化的对象。它包含一个更新方法,当主题对象的状态发生变化时,这个方法会被调用,进行相应的处理。
举个例子
- 定义一个主题接口
Subject
,包括添加、删除观察者和通知观察者的方法。 - 定义一个观察者接口
Observer
,包括更新方法update()
。 - 创建一个具体的主题类
ConcreteSubject
实现Subject
接口,维护观察者列表,并在状态变化时通知所有观察者。 - 创建一个具体的观察者类
ConcreteObserver
实现Observer
接口,并在update()
方法中进行相应的处理。 - 测试观察者模式。
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;}// 更新方法@Overridepublic 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
,然后将观察者添加到主题中。当主题的状态发生变化时,观察者会接收到通知并进行处理。