前言
在使用 Java 写代码的过程中,我们经常遇到需要拓展功能的情况,为了代码更加灵活,我们必须学习设计模式。
实现截图
观察者模式
观察者模式=主题+观察者
类似报社订阅者发放报纸:
1. 订阅者订阅报纸,以后每当新闻出现,订阅者都会收到报社的新报纸。
2. 订阅者取消订阅后,报社不再发放报纸。
3. 一家报社对应多个订阅者。
实现原理
两个接口:
Subject | Observer |
---|---|
registerObserver(Observer observer); | update(data) |
removeObserver(Observer observer) | |
notifyObserver() |
实现类分为两种:主题类和观察者类
代码 Example
我们弃用面向实现编程,代码使用面向接口编程,说人话就是:抽离出代码中变化的部分,放到功能接口里。
定义了一个天气数据主题,当天气发生改变时,观察者实现类收到通知就更新数据。
- 主题接口
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver();
}
- 观察者接口
public interface Observer {
void update(double temp,double humdity,double pressure);
}
- 显示接口
public interface DispayElement {
void display();
}
- 主题实现类
import java.util.ArrayList;
import java.util.List;
public class WeatherData implements Subject {
private List observerList;
private double temp;
private double humdity;
private double pressure;
public WeatherData(){
observerList=new ArrayList();
}
//注册观察者
@Override
public void registerObserver(Observer observer) {
observerList.add(observer);
}
//移除观察者
@Override
public void removeObserver(Observer observer) {
int index=observerList.indexOf(observer);
observerList.remove(index);
}
@Override
public void notifyObserver() {
for(int i=0;i<observerList.size();i++){
Observer observer= (Observer) observerList.get(i);
observer.update(temp,humdity,pressure);
}
}
public void setInfo(double temp,double humdity,double pressure){
this.temp=temp;
this.humdity=humdity;
this.pressure=pressure;
notifyObserver();
}
}
- 观察者实现类
public class CurrentConditionDisplay implements Observer,DispayElement {
private double temp;
private double humdity;
private WeatherData weatherData;
public CurrentConditionDisplay(WeatherData weatherData){
this.weatherData=weatherData;
weatherData.registerObserver(this);
}
@Override
public void display() {
System.out.println("CurrentConditionDisplay :"+temp+"F degrees and "+humdity+" & humdity");
}
@Override
public void update(double temp, double humdity, double pressure) {
this.temp=temp;
this.humdity=humdity;
display();
}
}
- 程序入口
public class Test {
public static void main(String [] args){
WeatherData weatherData=new WeatherData();
CurrentConditionDisplay currentConditionDisplay=new CurrentConditionDisplay(weatherData);
weatherData.setInfo(10,20,30);
weatherData.setInfo(20,50,70);
}
}