原理
对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer编号
代码示例
天气变化,通知到第三方
Observer:观察者接口
public interface Observer {
void update(float temperature,float pressure,float humidity);
}
Subject:第三方接入接口
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver();
}
观察者接口具体实现
public class CurrentCondition 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;
dispaly();
}
public void dispaly(){
System.out.println("today temperature:" + this.temperature);
System.out.println("today pressure:" + this.pressure);
System.out.println("today humidity:" + this.humidity);
}
}
Subject具体实现
public class WeatherData implements Subject{
private float temperature;
private float pressure;
private float humidity;
/**
* 观察者集合
*/
private List<Observer> observerList;
public WeatherData(){
this.observerList = 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;
dataChange();
}
public void dataChange() {
notifyObserver();
}
/**
* 注册一个观察者
* @param observer
*/
@Override
public void registerObserver(Observer observer) {
this.observerList.add(observer);
}
/**
* 移除一个观察者
* @param observer
*/
@Override
public void removeObserver(Observer observer) {
if (this.observerList.contains(observer)){
this.observerList.remove(observer);
}
}
/**
* 遍历所有观察者,并通知
*/
@Override
public void notifyObserver() {
for (Observer observer : this.observerList) {
observer.update(this.temperature,this.pressure,this.humidity);
}
}
}
客户端调用
public class Client {
public static void main(String[] args) {
// 创建一个weatherData
WeatherData weatherData = new WeatherData();
// 创建观察者
CurrentCondition currentCondition = new CurrentCondition();
// 注册到观察者
weatherData.registerObserver(currentCondition);
// 测试 通知各个注册的观察者
weatherData.setData(10,100,30);
System.out.println("==========================");
weatherData.setData(20,120,10);
}
}