本文字数为 2412 字, 预计读完大约需要 7 分钟
观察者模式
定义了对象之间的一对多依赖,当一个对象改变状态的时候,它的所有依赖者都会收到通知而自动更新
- 定义被观察者接口
- 定义观察者接口
- 实现被观察者接口
- 实现观察者接口
- 测试
/**
* 定义被观察者接口,定义被观察者应该实现的方法
* 包括观察者注册,移除观察者,以及通知观察者数据的更新
*/
public interface Subject{
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(Object subject, Object dataChanges);
}
/**
* 定义观察者接口
*/
public interface Observer {
/**
* 接收被观察者的更新消息
* 第一个参数是被观察者的对象,用于观察者主动从被观察者哪里获取消息
* 第二个参数是被更改的数据,用于通知观察者被动更改数据
*/
void update(Object subject, Object dataChanges);
}
/**
* 被更新的数据
*/
public class Data {
private float temperature;
private float humidity;
private float pressure;
public Data(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
@Override
public String toString() {
return "temperature:" + temperature + " humidity:" + humidity + " pressure:" + pressure;
}
}
public class WeatherData implements Subject {
/**
* 用于存放所有的观察者
*/
private List<Observer> observers;
public WeatherData() {
this.observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
this.observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
this.observers.remove(observer);
}
public void setData(Data data) {
notifyObservers(this, data);
}
@Override
public void notifyObservers(Object subject, Object dataChanges) {
observers.forEach((observer) -> observer.update(subject, dataChanges));
}
}
//实现观察者
public class CurrentConditionsDisplay implements Observer {
private int id;
public CurrentConditionsDisplay() {
this.id = new Random().nextInt(100);
}
@Override
public void update(Object subject, Object dataChanges) {
System.out.println("Observer[" + id + "] observe data:");
System.out.println(dataChanges);
}
}
//测试
private static void testObserver() {
WeatherData weatherData = new WeatherData();
CurrentConditionsDisplay observer1 = new CurrentConditionsDisplay();
CurrentConditionsDisplay observer2 = new CurrentConditionsDisplay();
CurrentConditionsDisplay observer3 = new CurrentConditionsDisplay();
weatherData.registerObserver(observer1);
weatherData.registerObserver(observer2);
weatherData.registerObserver(observer3);
weatherData.setData(new Data(17.0f, 18.1f, 45.6f));
weatherData.setData(new Data(25.0f, 12.1f, 45.6f));
weatherData.setData(new Data(84.0f, 18.8f, 45.6f));
weatherData.setData(new Data(47.0f, 14.4f, 45.6f));
weatherData.removeObserver(observer1);
weatherData.removeObserver(observer2);
weatherData.removeObserver(observer3);
}
本文由 MengFly 创作,采用
知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:2018-02-23 00:00:00
相关文章推荐: