用java给我写一个带窗口观察者模式
时间: 2024-09-19 14:06:54 浏览: 18
在Java中,我们可以使用观察者模式(Observer Pattern)创建一个带有GUI界面的应用程序,比如一个简单的天气预报系统。下面是一个简单的例子,展示了如何使用`javax.swing`框架和`Observable`接口来实现窗口观察者:
```java
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
// 观察者接口
interface Observer {
void update(String message);
}
// 被观察者类,这里模拟天气数据
class WeatherData {
private String weather;
public WeatherData(String weather) {
this.weather = weather;
}
public String getWeather() {
return weather;
}
// 添加或移除观察者
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
// 更新天气并通知所有观察者
public void setWeather(String newWeather) {
weather = newWeather;
fireUpdate();
}
private void fireUpdate() {
for (Observer observer : observers) {
observer.update(weather);
}
}
private List<Observer> observers = new ArrayList<>();
}
// 观察者类,这里的WindowObserver是JFrame的一个实例
class WindowObserver implements Observer {
private JLabel weatherLabel;
public WindowObserver(JFrame frame, JLabel label) {
this.weatherLabel = label;
weatherLabel.setText("初始状态");
WeatherData data = new WeatherData("晴天");
data.addObserver(this);
}
@Override
public void update(String message) {
SwingUtilities.invokeLater(() -> weatherLabel.setText(message));
}
}
public class Main {
public static void main(String[] args) {
JFrame window = new JFrame("Weather Update");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel weatherLabel = new JLabel();
window.getContentPane().add(weatherLabel);
WindowObserver observer = new WindowObserver(window, weatherLabel);
WeatherData weatherData = new WeatherData("晴天");
// 模拟获取实时天气,实际上这里需要从网络或其他源获取数据
Thread thread = new Thread(() -> {
try {
Thread.sleep(2000); // 延迟2秒模拟获取过程
weatherData.setWeather("下雨了");
Thread.sleep(2000); // 再延迟2秒模拟更新
weatherData.setWeather("多云");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start();
}
}
```
在这个示例中,`WindowObserver`实现了`Observer`接口,当`WeatherData`的`weather`属性变化时,会更新`WindowObserver`中的`JLabel`显示新消息。