概念
观察者模式属于行为型模式。是对象之间多对一依赖的一种设计方案,当一个对象被修改时,则会自动通知依赖它的对象,被依赖的对象为Subject(一的一方),依赖的对象为Observer(多的一方);
该模式与之前写的事件通知(https://www.jianshu.com/p/97ffd1f8890d)思想一致,详情可以查看
应用场景举例
天气时时推送,天气数据中心是用于存储天气数据,并提供一个第三方接口用于天气数据推送,有百度,新浪等网址接入到天气数据中心来获取天气数据,这就可以使用到观察者模式。
UML
观察者模式代码
- 天气类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Wether {
private float temperature;
private float humidity;
}
- 被依赖抽象接口
public interface Subject {
//新增观察者
void add(Observer observer);
//移除观察者
void remove(Observer observer);
//通知观察者
void inform();
}
- 天气中心
@Data
public class WetherData implements Subject{
private Wether wether;
private List<Observer> observers;
public WetherData(){
observers=new ArrayList<>();
}
@Override
public void add(Observer observer) {
if (!observers.contains(observer)){
observers.add(observer);
}
}
@Override
public void remove(Observer observer) {
if (observers.contains(observer)){
observers.remove(observer);
}
}
@Override
public void inform() {
observers.forEach(s->s.getWether(this.wether));
}
}
- 观察者抽象接口
public interface Observer {
//获取天气数据
void getWether(Wether wether);
}
- 新浪
public class Xinlang implements Observer {
@Override
public void getWether(Wether wether) {
System.out.println("新浪--今日湿度:"+wether.getHumidity());
System.out.println("新浪--今日温度:"+wether.getTemperature());
}
}
- 百度
public class Baidu implements Observer {
@Override
public void getWether(Wether wether) {
System.out.println("百度--今日湿度:"+wether.getHumidity());
System.out.println("百度--今日温度:"+wether.getTemperature());
}
}
spring源码应用解析
-
java.util.Observable
图片.png -
观察者
图片.png
网友评论