观察者模式浅谈篇(三)
这一篇是观察者模式结尾篇,主要讲解Java.utils.Observer(Java内置观察者模式)运作方式
方法介绍:
- addObserver(Observer observer)增加观察者
- deleteObserver(Observer observer)删除观察者[还有一个deleteObserver()方法没有形参]
- notifyObserver()通知观察,这个用于观察者从主题对象(可观察者对象)拉数据。
- notifyObserver(Object arg)通知观察者并更新数据。
- Update(Observer o,Object arg)Observer主题对象本身,好让观察者知道是哪个主题。Object传入的数据对象。
具体代码实现我还是使用第一篇我的需求:天气预报(当天气数据更新后,用户界面需要实时展示)
可观察模式对象逻辑代码:
package com.example.observerjavatextdemo;
import java.util.Observable;
//主题对象:当有了新的数据产生 立即通知观察者
public class WeatherData extends Observable{
private float temperature;
private float humidity;
private float pressure;
public WeatherData() {
}
public void measurementsChanged() {
setChanged();//在notifyObservers()方法前调用setChanged()是标记数据已经更改
//【这个方法后面也可以做过滤用eg:不要立马通知过多长时间在设置为数据已更新】观察者可以用hasChange判断是否更新
notifyObservers();//这里使用notifyObservers()方法主要是用于观察者拉数据,而不是一有数据就通知观察者
//不管观察者是否需要
}
public void setMeasurements(float temperature, float humidity,
float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
public float getTemperature() {
return temperature;
}
public float getHumidity() {
return humidity;
}
public float getPressure() {
return pressure;
}
}
观察者模式逻辑代码:
package com.example.observerjavatextdemo;
import java.util.Observable;
import java.util.Observer;
//观察者对象
public class CurrentConditionDisplay implements Observer {
public Observable observer;
private float temperature;
private float humidity;
public CurrentConditionDisplay(Observable observer) {
System.out.println("CurrentConditionDisplay()");
this.observer = observer;
this.observer.addObserver(this);
}
//当数据更新 会自动调用这个方法【前提是观察者调用了addObserver()这个订阅方法】
public void update(Observable arg, Object arg1) {
System.out.println("update()");
if (arg instanceof WeatherData) {
WeatherData weatherDate = (WeatherData) arg;
humidity = weatherDate.getHumidity();//这样就是拉数据
//因为我们调用的是notifyObservers()无参,故Object为空
temperature = weatherDate.getTemperature();
display();
}
}
public void display() {
System.out.println("display() this.temperature:" + temperature
+ " ,this.humidity:" + humidity);
}
}
测试类代码:
package com.example.observerjavatextdemo;
public class WeatherStation {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionDisplay currentCondition = new CurrentConditionDisplay(weatherData);
weatherData.setMeasurements(80, 65, 30.4f);
}
}
打印结果:
上面是采用的是拉数据,当根据业务需要,需要push数据时,中调用notifyObservers(数据源),Observer端中update(Observable arg, Object arg1) 对该数据转型就行了。
Java内置观察者模式使用如以上介绍方法,这里我总结我讲解的三篇观察者模式:
观察者模式定义:在对象中定义一对多的依赖,当一个对象改变状态,依赖它的对象都会收到通知自动更新。
这里的“一”就是可观察者(主题对象)这里的“多”就是观察者,“依赖”就是观察者与主题对象建立注册关系。
这样主题对象变化,观察者就可以实时收到更新数据。
跨进程观察者模式:使用只要主要观察者模式的注册与解除注册传输到服务端对象相同就可以。
Java内置观察模式:使用简单,可以实现“拉”数据,“推”数据两种方式。但是不易于松耦合。因为采用的是继承而不是接口。
各位读者可以根据不同的需求使用不同的观察者模式,这样代码逻辑清晰而且后期好维护。
谢谢品读!!