多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
package com.strife.pattern.observer;
import java.util.ArrayList;
import java.util.List;
/**
* 观察者模式
*
* @author mengzhenghao
* @date 2022/6/2
*/
public class Observer {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
AbstractObserver observer1 = new ConcreteObserver();
AbstractObserver observer2 = new BaiduSite();
weatherData.registerObserver(observer1);
weatherData.registerObserver(observer2);
weatherData.setData(21, 10, 10);
System.out.println("--------------------------------------");
weatherData.removeObserver(observer2);
weatherData.setData(22.0f, 130.1f, 15);
}
}
/** 抽象主题 */
interface Subject {
/** 注册观察者 */
void registerObserver(AbstractObserver observer);
/** 删除观察者 */
void removeObserver(AbstractObserver observer);
/** 通知所有观察者 */
void notifyObservers();
}
/** 具体主题:被观察者 */
class WeatherData implements Subject {
/** 温度 */
private float temperature;
/** 气压 */
private float pressure;
/** 湿度 */
private float humidity;
/** 观察者集合 */
private List<AbstractObserver> observers;
public WeatherData() {
this.observers = new ArrayList<>();
}
public float getTemperature() {
return temperature;
}
public float getPressure() {
return pressure;
}
public float getHumidity() {
return humidity;
}
public void setData(float temperature, float pressure, float humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
//通知观察者
notifyObservers();
}
@Override
public void registerObserver(AbstractObserver observer) {
observers.add(observer);
}
@Override
public void removeObserver(AbstractObserver observer) {
if (observers.contains(observer)) {
observers.remove(observer);
}
}
@Override
public void notifyObservers() {
for (AbstractObserver observer : observers) {
observer.update(this.temperature, this.pressure, this.humidity);
}
}
}
/** 抽象观察者 */
abstract class AbstractObserver {
public abstract void update(float temperature, float pressure, float humidity);
}
class ConcreteObserver extends AbstractObserver {
/** 温度 */
private float temperature;
/** 气压 */
private float pressure;
/** 湿度 */
private float humidity;
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("----------当前天气情况----------");
System.out.println("temperature: " + this.temperature);
System.out.println("pressure: " + this.pressure);
System.out.println("humidity: " + this.humidity);
}
}
class BaiduSite extends AbstractObserver {
/** 温度 */
private float temperature;
/** 气压 */
private float pressure;
/** 湿度 */
private float humidity;
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("----------当前天气情况----------");
System.out.println("百度气温: " + this.temperature);
System.out.println("百度气压: " + this.pressure);
System.out.println("百度湿度: " + this.humidity);
}
}