使用场景
一个状态改变,需要同时改变其他对象的状态,而且不确定是多少个,也不知道其他对象是谁
优点:观察者与被观察者抽象解耦
缺点:程序中包括一个被观察者和多个被观察者,开发和调试比较复杂,而且Java中的消息的通知默认是顺序执行的,一个观察者的卡顿会影响整体的执行效率。在这种情况下,一般考虑采用异步的方式。
//被观察者接口
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
//具体被观察者
public class WeatherData implements Subject {
private static WeatherData instance;
private ArrayList<Observer> observers = new ArrayList<>();
private float weather;
public static WeatherData getInstance() {
if (instance == null) {
instance = new WeatherData();
}
return instance;
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(weather);
}
}
public void setWeather(float weather) {
this.weather = weather;
notifyObservers();
}
}
//订阅
WeatherData.getInstance().registerObserver(new Observer() {
@Override
public void update(float weather) {
System.out.println("天气变了,变成"+weather+"度");
}
});
//当某一刻天气变了
WeatherData.getInstance().setWeather(10);
WeatherData.getInstance().setWeather(12);
WeatherData.getInstance().setWeather(14);
WeatherData.getInstance().setWeather(34);