您现在的位置是:首页 >技术杂谈 >设计模式-观察者模式网站首页技术杂谈
设计模式-观察者模式
简介设计模式-观察者模式
问题背景
气象站每天会实时观察天气数据,然后将这些数据推送到企业,企业可以自行处理这些数据然后进行展示。
1)气象站可以将自己的数据公布出去
2)数据可能会经常更新,企业能实时收到数据
3)需要设计开放型API,便于其他第三方也能接入气象站获取数据。
观察者模式
观察者模式就是发送数据的一方维护一个观察者集合,想要接受数据的观察者就来订阅这个数据放,这样数据方就可以实时将数据推送到观察者。
1)这个观察者集合必须是动态维护的。
2)观察者必须实现统一的接口来让数据方实时调用同步数据
3)观察者模式是对象之间多对一的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化。
解决方案
UML类图
1)Subject是被订阅方要实现的接口,它定义了动态维护观察者集合的方法
2)WeatherData是气象站,它实现Subject接口来作为被调用方,动态维护观察者的集合
3)Observer是观察者要实现的接口,定义了更新数据的接口
4)CurrentCondition是气象站自己展示数据的网站,Baidu、Sina是订阅气站站数据的企业
代码示例
public interface Subject {
/**
* 订阅
*
* @param observer
*/
void registerObserver(Observer observer);
/**
* 取消订阅
*
* @param observer
*/
void remove(Observer observer);
/**
* 发送消息
*/
void notifyObservers();
}
public class WeatherData implements Subject{
private double temperatrue;
private double pressure;
private double humidity;
List<Observer> list = new ArrayList<>();
@Override
public void registerObserver(Observer observer) {
list.add(observer);
}
@Override
public void remove(Observer observer) {
list.remove(observer);
}
/**
* 设置信息
*
* @param temperatrue
* @param pressure
* @param humidity
*/
public void set(double temperatrue, double pressure, double humidity) {
this.temperatrue = temperatrue;
this.pressure = pressure;
this.humidity =humidity;
}
/**
* 推送给企业
*
*/
@Override
public void notifyObservers() {
for (Observer observer : list) {
observer.update(temperatrue, pressure, humidity);
}
}
}
public interface Observer {
/**
* 更新信息
*/
void update(double temperatrue, double pressure, double humidity);
}
public class Baidu implements Observer{
private double temperatrue;
private double pressure;
private double humidity;
public void display(double temperatrue, double pressure, double humidity) {
System.out.println("Baidu温度:" + temperatrue);
System.out.println("Baidu湿度:" + pressure);
System.out.println("Baidu气压:" + humidity);
}
@Override
public void update(double temperatrue, double pressure, double humidity) {
this.temperatrue = temperatrue;
this.pressure = pressure;
this.humidity = humidity;
display(this.temperatrue, this.pressure, this.humidity);
}
}
public class Sina implements Observer{
private double temperatrue;
private double pressure;
private double humidity;
public void display(double temperatrue, double pressure, double humidity) {
System.out.println("sina温度:" + temperatrue);
System.out.println("sina湿度:" + pressure);
System.out.println("sina气压:" + humidity);
}
@Override
public void update(double temperatrue, double pressure, double humidity) {
this.temperatrue = temperatrue;
this.pressure = pressure;
this.humidity = humidity;
display(this.temperatrue, this.pressure, this.humidity);
}
}
public class Client {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
// Baidu订阅
Baidu baidu = new Baidu();
weatherData.registerObserver(baidu);
weatherData.set(1.1,2.1,3.1);
weatherData.notifyObservers();
System.out.println("==================================");
// Sina订阅
Sina sina = new Sina();
weatherData.registerObserver(sina);
weatherData.set(11.1,22.1,33.1);
weatherData.notifyObservers();
System.out.println("==================================");
// Baidu取消
weatherData.remove(baidu);
weatherData.set(111.1,222.1,333.1);
weatherData.notifyObservers();
}
}
观察者模式的好处
1)观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册,移除和通知
2)这样,我们增加观察者,就不需要去修改核心类WeatherData的代码,遵守了OCP原则
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。