观察者模式
原理:
观察者模式类似于定牛奶业务
subject:等级、移除、通知
- registerObserver:注册
- removeObserver:移除
- notifyObservers:通知所有的注册的用户,根据需求不同,可以更新数据,让用户来取,也可能是实施推送,看具体需求而定
observer:接收输入,主要是update()方法
观察者模式:对象之间多对一的一种设计方案,被依赖的对象为subject,依赖的对象为observer,subject通知Observer变化,比如这里的奶站是subject,是1的一方,用户是Observer,是多的一方
案例:
实现一个不同网站请求天气网站,获取天气不断变化的功能
类图:
/**
* 主题接口
*/
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver();
}
/**
* 主题类
*/
public class WeatherData implements Subject {
private int temperature;
private int pressure;
private int humidity;
private List<Observer> observers = new ArrayList<>();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if(observers.contains(observer)){
observers.remove(observer);
}
}
@Override
public void notifyObserver() {
for (Observer o: observers) {
o.update(temperature,pressure,humidity);
}
}
//气温变化,通知所有订阅者
public void setCondition(int temperature,int pressure,int humidity){
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
notifyObserver();
}
}
//观察者
public interface Observer {
void update(int temperature,int pressure,int humidity);
}
/**
* 具体订阅者
*/
public class Sina implements Observer {
private int temperature;
private int pressure;
private int humidity;
@Override
public void update(int temperature, int pressure, int humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
display();
}
private void display() {
System.out.println("这里是新浪网站");
System.out.println("========temperature is ======" + temperature + "==============");
System.out.println("========pressure is =======" + pressure + "=============");
System.out.println("========humidity is ======" + humidity + "=============");
}
}
/**
* 具体订阅者
*/
public class Baidu implements Observer {
private int temperature;
private int pressure;
private int humidity;
@Override
public void update(int temperature, int pressure, int humidity) {
this.temperature = temperature;
this.pressure = pressure;
this.humidity = humidity;
display();
}
private void display() {
System.out.println("这里是百度网站");
System.out.println("========temperature is ======" + temperature + "==============");
System.out.println("========pressure is =======" + pressure + "=============");
System.out.println("========humidity is ======" + humidity + "=============");
}
}
public class Client {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
Sina sina = new Sina();
Baidu baidu = new Baidu();
weatherData.registerObserver(sina);
weatherData.registerObserver(baidu);
System.out.println("通知各个观察者,看看信息");
weatherData.setCondition(10,100,30);
weatherData.removeObserver(baidu);
weatherData.notifyObserver();
}
}
源码使用:
观察者模式在JDK中的源码分析:
- JDK中的Observable类就使用了观察者模式
角色分析:
- Observable的作用和地位等价于我们前面讲过的Subject
- Observable是类不是借口,类中已经实现了核心的方法,即管理Observer的方法add。。delete。。notify等
- Observer 的作用和地位等价于我们讲过的Observer,有update方法
- Observable和Observer的使用方法和前面讲过的一样,只是Observable是类,通过继承来实现观察者模式