观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,所有依赖于它的观察者都会得到通知并自动更新。
该模式主要涉及两种角色:
主题(Subject): 也称为被观察者或可观察对象,是目标对象。它包含一系列观察者,并提供方法来添加、删除观察者以及通知观察者的操作。
观察者(Observer): 也称为订阅者,它定义了一个更新的接口,用于主题在状态发生变化时通知观察者。
观察者模式的核心思想是解除主题和观察者之间的耦合关系,使得它们可以独立变化。当主题的状态发生变化时,所有的观察者都能够及时得到通知,并进行相应的处理。
下面是一个简单的观察者模式的例子,假设我们有一个气象站,它可以实时测量温度,并通知多个观察者:
- import java.util.ArrayList;
- import java.util.List;
-
- // 主题接口
- interface Subject {
- void addObserver(Observer observer);
- void removeObserver(Observer observer);
- void notifyObservers();
- }
-
- // 观察者接口
- interface Observer {
- void update(float temperature);
- }
-
- // 具体主题
- class WeatherStation implements Subject {
- private List
observers = new ArrayList<>(); - private float temperature;
-
- public void setTemperature(float temperature) {
- this.temperature = temperature;
- notifyObservers();
- }
-
- @Override
- public void addObserver(Observer observer) {
- observers.add(observer);
- }
-
- @Override
- public void removeObserver(Observer observer) {
- observers.remove(observer);
- }
-
- @Override
- public void notifyObservers() {
- for (Observer observer : observers) {
- observer.update(temperature);
- }
- }
- }
-
- // 具体观察者
- class Display implements Observer {
- private float temperature;
-
- @Override
- public void update(float temperature) {
- this.temperature = temperature;
- display();
- }
-
- public void display() {
- System.out.println("Current Temperature: " + temperature);
- }
- }
-
- // 客户端
- public class Client {
- public static void main(String[] args) {
- WeatherStation weatherStation = new WeatherStation();
-
- Display display1 = new Display();
- Display display2 = new Display();
-
- weatherStation.addObserver(display1);
- weatherStation.addObserver(display2);
-
- // 模拟温度变化
- weatherStation.setTemperature(25.5f);
- weatherStation.setTemperature(28.0f);
- }
- }
在这个例子中,WeatherStation
是具体主题,实现了 Subject
接口。Display
是具体观察者,实现了 Observer
接口。客户端通过调用 addObserver
方法将观察者注册到主题中,然后通过 setTemperature
方法模拟温度的变化,观察者会收到通知并更新自己的状态。