当一个对象更改状态,可以自动通知并更新其所有依赖项(观察者),就像是事件总线,谁有监听,有消息时谁就会收到此消息
使用场景
当一个对象的状态改变,希望其它不知道是谁的对象也能够及时更新并且保证低耦合
代码示例
import java
.util
.ArrayList
;
import java
.util
.List
;
public class Weather {
private String currentWeather
;
private List
<WeatherObserver> observers
;
public Weather() {
observers
= new ArrayList<>();
}
public void addObserver(WeatherObserver obs
) {
observers
.add(obs
);
}
public void removeObserver(WeatherObserver obs
) {
observers
.remove(obs
);
}
public void setCurrentWeather(String weather
) {
currentWeather
= weather
;
notifyObservers();
}
private void notifyObservers() {
for (WeatherObserver obs
: observers
) {
obs
.update(currentWeather
);
}
}
}
public interface WeatherObserver {
void update(String currentWeather
);
}
public class FishermanObserver implements WeatherObserver {
@Override
public void update(String currentWeather
) {
System
.out
.println("渔民收到的天气 = " + currentWeather
);
}
}
public class FarmerObserver implements WeatherObserver {
@Override
public void update(String currentWeather
) {
System
.out
.println("农场主收到的天气 = " + currentWeather
);
}
}
public class App {
public static void main(String
[] args
) {
Weather weather
= new Weather();
weather
.addObserver(new FishermanObserver());
weather
.addObserver(new FarmerObserver());
weather
.setCurrentWeather("rainy day");
}
}
角色说明
Subject(Weather):也叫被观察者,主要的对象,负责管理观察者和改变后通知观察者Observer (WeatherObserver):观察者接口,所有观察者都需要实现Concrete Observer(FishermanObserver、FarmerObserver):具体观察者的实现
优缺点
优点
观察者和被观察者是抽象耦合的建立一套触发机制
缺点
如果观察者太多,通知所有观察者需要花费比较多的时间观察者和被观察者有相互调用,可能会触发循环调用
扩展
对于有多个观察目标的情况,需要抽象出AbstractWeather,所有观察目标都实现AbstractWeather抽象类,一个观察者可以观察多个目标,一个目标可以被多个观察者观察