在Android开发中,使用Java的观察者模式(Observer Pattern)是一种常见的做法,用于实现对象之间的松耦合。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
以下是Android开发中使用Java实现观察者模式的基本步骤和示例代码:
### 1. 定义Subject接口
Subject接口定义了添加、删除观察者和通知观察者的方法。
import java.util.ArrayList;
import java.util.List;
public interface Subject {
// 注册观察者
void registerObserver(Observer o);
// 移除观察者
void removeObserver(Observer o);
// 通知所有观察者
void notifyObservers();
}
### 2. 定义Observer接口
Observer接口定义了观察者收到通知后需要执行的方法。
public interface Observer {
// 更新方法,由主题对象调用
void update(String message);
}
### 3. 实现Subject接口
这里以具体的主题类为例,比如一个天气预报系统。
public class WeatherData implements Subject {
private List<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(convertToString());
}
}
private String convertToString() {
return "Current conditions: " + temperature + "F degrees and " + humidity + "% humidity";
}
// 假设这是天气数据更新的方法
public void measurementsChanged() {
// 这里可以添加逻辑来更新temperature, humidity, pressure等属性
// 然后通知所有观察者
notifyObservers();
}
// Getters and Setters
public void setTemperature(float temperature) {
this.temperature = temperature;
}
// 类似地,添加humidity和pressure的setters
}
### 4. 实现Observer接口
创建具体的观察者类,比如一个显示天气数据的UI组件。
public class CurrentConditionsDisplay implements Observer {
private float temperature;
private float humidity;
private Subject weatherData;
public CurrentConditionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
@Override
public void update(String message) {
System.out.println("Displayed: " + message);
}
// 这里可以添加其他逻辑,比如根据消息更新UI等
}
### 使用示例
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay display = new CurrentConditionsDisplay(weatherData);
// 假设这里更新天气数据
weatherData.setTemperature(80.0f);
// 天气数据更新后,会自动调用notifyObservers()
}
}
在这个例子中,当`WeatherData`的`measurementsChanged`方法被调用时(虽然在这个简单的示例中没有直接调用),它会通知所有注册的观察者(在这个例子中是`CurrentConditionsDisplay`),然后观察者会收到更新的天气信息并作出相应的处理(比如更新UI)。