android开发中使用java观察者模式


在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)。