观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
观察者模式和报社与保亭很像。
观察者模式需要两方:生产者(报社)、订阅者(报亭)
报社每次有新的报纸就会推送给订阅了服务的报亭。这两方就称作:Subject(主题)、Observer(观察者)
这种模式下主题和观察者是松耦合的,主题只关注哪些群组订阅了主题,他会给这些主题发送消息,但他并不关注这些主题都是什么,也不关注主题如何处理消息。
一、主题与观察者
主题(具有的方法):
- 添加观察者
- 移除观察者
- 通知观察者
观察者(具有的方法):
- 更新方法
二、具体实现
首先在主题内添加观察者,然后主题内信息发生改变后调用观察者的更新方法。
根据这个逻辑写一个天气系统
主题
public class Subject {
/**
* 观察者列表
* */
private List<Observer> observers = new ArrayList<>();
/**
* 添加观察者
* */
public void add(Observer observer) {
this.observers.add(observer);
}
/**
* 移除观察者
* */
public void remove(Observer observer) {
this.observers.remove(observer);
}
/**
* 通知观察者
* */
public void notifyObserver(Object... args) {
// 循环通知每一个观察者
for (Observer observer : this.observers) {
observer.update(args);
}
}
}
观察者
public interface Observer {
void update(Object... args);
}
实际主题:天气中心
public class WeatherData extends Subject {
/**
* 温度
* */
private int temperature;
/**
* 湿度
* */
private int humidity;
public void onChange(Integer temperature, Integer humidity) {
this.temperature = temperature;
this.humidity = humidity;
super.notifyObserver(this.temperature, this.humidity);
}
}
实际观察者
public class StatisticsDisplay implements Observer {
/**
* 温度
* */
private int temperature;
/**
* 湿度
* */
private int humidity;
@Override
public void update(Object... args) {
this.temperature = (int)args[0];
this.humidity = (int)args[1];
System.out.println("当前观察者统计站记录温度,湿度:" + this.temperature + "," + this.humidity);
}
}
main方法
public class main {
public static void main(String[] args) {
// 观察者
StatisticsDisplay observer = new StatisticsDisplay();
// 主题
WeatherData object = new WeatherData();
// 主题改变
object.onChange(10,12);
// 订阅主题
object.add(observer);
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("输入温度:");
Integer b = sc.nextInt();
System.out.print("输入湿度:");
Integer c = sc.nextInt();
object.onChange(b, c);
}
}
}