一.什么是观察者模式
观察者设计模式定义了对象间一对多的组合关系,一个对象发生改变,依赖它的多个对象会收到通知并自动更新
二.观察者模式的应用场景
1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。
2.节目订阅后,一旦有更新及时推送给订阅者
三.观察者模式优点
1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
四.用例图
package observer2;
import java.util.Observable;
import java.util.Observer;
import observer.Display;
public class CurrentConditionDisplay implements Observer,Display{
Observable observable;
private float tempeture;
private float humidity;
public CurrentConditionDisplay(Observable observable) {
//构造方法需要引入一个主题类(继承Observable)
this.observable=observable;
//加入主题注册队列
observable.addObserver(this);
}
public void display() {
System.out.println("Current conditons"+tempeture+"F degree and"+humidity+"% humidity");
}
public void update(Observable obs, Object arg) {
if(obs instanceof WeatherData) {//判断主题是否对应
//默认为pull方式获取更新数据,这样适应性更强
WeatherData weatherData = (WeatherData) obs;
this.tempeture=weatherData.getTemperature();
this.humidity=weatherData.getHumidity();
//更新面板数据
display();
}
}
}
package observer2;
import java.util.Observable;
public class WeatherData extends Observable{
private float temperature;
private float humidity;
private float pressure;
public void measurementsChanged() {
setChanged();
//观察者自己需要什么数据,自己去主题那里去pull
notifyObservers();
//由主题主动Push需要改变的数据对象给观察者
//notifyObservers(temperature);
}
public void setWeatherData(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 observer2;
public class WeatherTest {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionDisplay currentDisplay = new CurrentConditionDisplay (weatherData);
weatherData.setWeatherData(80, 65, 30.4f);
weatherData.setWeatherData(82, 70, 29.2f);
weatherData.setWeatherData(78, 90, 29.2f);
}
}
参考:https://blog.youkuaiyun.com/ma598214297/article/details/80557821