设计模式(行为型设计模式——观察者模式)
观察者模式
基本定义
模式结构
代码实现
Subject 抽象主题
public interface Subject {
void registerObserve(Observe observe);
void removeObserve(Observe observe);
void notifyAllObserve();
}
ConcreteSubject 具体主题
@Slf4j
public class WeatherSubject implements Subject {
List<Observe> observes = new ArrayList<>();
Weather weather;
@Override
public void registerObserve(Observe observe) {
observes.add(observe);
}
@Override
public void removeObserve(Observe observe) {
log.info("移除观察者 {}", observe.name());
observes.remove(observe);
}
@Override
public void notifyAllObserve() {
if(observes.isEmpty()){
log.info("暂无观察者");
return;
}
observes.stream().forEach((observe)->{
observe.update(weather);
});
}
public void setWeather(Weather weather) {
this.weather = weather;
notifyAllObserve();
}
}
POJO 普通Java实体:通知内容封装
@Data
public class Weather {
private String date;
private int temperature;
private int humidity;
private int windPower;
public Weather(String date, int temperature, int humidity, int windPower) {
this.date = date;
this.temperature = temperature;
this.humidity = humidity;
this.windPower = windPower;
}
}
Observer 观察者
public interface Observe {
String name();
void update(Weather weather);
}
ConcreteObserver 具体观察者
@Slf4j
public class AppClientObserve implements Observe {
private Subject weatherSubject;
public AppClientObserve(Subject weatherSubject) {
this.weatherSubject = weatherSubject;
this.weatherSubject.registerObserve(this);
}
@Override
public String name() {
return "App客户端";
}
@Override
public void update(Weather weather) {
log.info("APP客户端:{} 最新天气:温度 {} ℃, 相对湿度 {} %, 风力 {} 级",
weather.getDate(), weather.getTemperature(), weather.getHumidity(), weather.getWindPower());
}
}
@Slf4j
public class H5ClientObserve implements Observe {
private Subject weatherSubject;
public H5ClientObserve(Subject weatherSubject) {
this.weatherSubject = weatherSubject;
this.weatherSubject.registerObserve(this);
}
@Override
public String name() {
return "H5客户端";
}
@Override
public void update(Weather weather) {
log.info("H5客户端:{} 最新天气:温度 {} ℃, 相对湿度 {} %, 风力 {} 级",
weather.getDate(), weather.getTemperature(), weather.getHumidity(), weather.getWindPower());
}
}
Client 客户端:测试类
public class Test {
public static void main(String[] args) {
WeatherSubject weatherSubject = new WeatherSubject();
Observe h5Observe = new H5ClientObserve(weatherSubject);
Observe appObserve = new AppClientObserve(weatherSubject);
weatherSubject.setWeather(new Weather("2020-4-16 12:00",24, 50, 2));
weatherSubject.setWeather(new Weather("2020-4-16 16:00",20, 70, 3));
weatherSubject.removeObserve(h5Observe);
weatherSubject.setWeather(new Weather("2020-4-16 18:00",15, 65, 1));
}
}
输出结果
优点
缺点
使用场景
总结