您好,登录后才能下订单哦!
Observer模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统、新闻订阅、状态监控等场景。
在Java中,Observer模式主要通过以下几个接口和类来实现:
java.util.Observer
:观察者接口,它定义了一个更新方法update(Observable o, Object arg)
,当被观察的对象状态发生变化时,会调用这个方法通知所有的观察者。
java.util.Observable
:被观察者类,它维护了一个观察者列表,提供了添加、删除观察者的方法,以及一个setChanged()
方法和一个notifyObservers(Object arg)
方法。setChanged()
方法用于标记对象的状态已经发生了变化,notifyObservers(Object arg)
方法用于通知所有的观察者。
下面是一个简单的使用Observer模式实现解耦的例子:
import java.util.Observable;
import java.util.Observer;
// 被观察者类
class WeatherData extends Observable {
private float temperature;
private float humidity;
private float pressure;
public void measurementsChanged() {
setChanged(); // 标记状态已改变
notifyObservers(); // 通知所有观察者
}
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
// 其他业务逻辑...
}
// 观察者接口
interface WeatherObserver extends Observer {
// 可以定义一些特定的方法,如果需要的话
}
// 具体观察者类
class CurrentConditionsDisplay implements WeatherObserver {
private float temperature;
private float humidity;
@Override
public void update(Observable o, Object arg) {
if (o instanceof WeatherData) {
WeatherData weatherData = (WeatherData) o;
this.temperature = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
// 测试类
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
weatherData.addObserver(currentDisplay);
weatherData.setMeasurements(80, 65, 30.4f);
weatherData.setMeasurements(82, 70, 29.2f);
}
}
在这个例子中,WeatherData
类是被观察者,它继承自Observable
类。CurrentConditionsDisplay
类是观察者,它实现了Observer
接口。当WeatherData
类的状态发生变化时,它会通知所有的观察者,观察者收到通知后会自动调用update
方法来更新自己的状态。
需要注意的是,从Java 9开始,java.util.Observable
和java.util.Observer
已经被标记为过时(deprecated),建议使用其他机制来实现观察者模式,例如使用java.beans.PropertyChangeListener
和java.beans.PropertyChangeSupport
,或者使用第三方库如RxJava等。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。