设计模式之观察者模式
设计模式 Java 大约 2390 字作用
定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新。
原理
Register:登记注册、移除和通知。
registerObserver
:注册removeObserver
:移除notifyObserver
:通知所有的注册用户,根据不同需求,可以是更新数据,让用户来取,也可能是实施推送。
Observer:接收输入。
案例
Register
public interface Register {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
ConcreteRegister
public class WeatherData implements Register {
private float temperature;
private float pressure;
private float humidity;
private List<Observer> observers;
public WeatherData() {
this.observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
observers.forEach(observer -> observer.update(temperature, pressure, humidity));
}
private void dataChange() {
notifyObservers();
}
public void setData(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
dataChange();
}
}
Observer
public interface Observer {
void update(float temperature, float pressure, float humidity);
}
ConcreteObserver
public class BaiduSite implements Observer {
private float temperature;
private float pressure;
private float humidity;
@Override
public void update(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("Baidu: " + temperature + " " + pressure + " " + humidity);
}
}
调用
public class Client {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
BaiduSite baiduSite = new BaiduSite();
weatherData.registerObserver(baiduSite);
weatherData.setData(20, 100, 30);
weatherData.removeObserver(baiduSite);
weatherData.setData(10, 50, 15);
}
}
源码
java.util.Observable:等价于Register,但Observable是类,已经实现了addObserver
、deleteObserver
、notifyObservers
方法。
java.util.Observer:等价于Observer,有update
方法。
阅读 1899 · 发布于 2019-12-30
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看
换一批
-
MongoDB 清理历史数据释放磁盘空间阅读 6843
-
Android 使用 tools schemas 预览 UI阅读 1913
-
软考-系统架构设计师:OSI/RM 七层模型阅读 2270
-
Spring Boot 整合 Keycloak阅读 531
-
MySQL 备份工具 xtrabackup 安装和使用阅读 1570
-
Linux 之安装 Maven阅读 1814
-
MySQL 之关键字和保留字阅读 1153
-
Nginx 使用 X-Accel-Redirect 实现静态文件下载的统计、鉴权、防盗链、限速等阅读 7497
-
IDEA 多个 Vue.js 工程识别 Webpack @ 别名阅读 539
-
JavaScript 对象阅读 1134