首先,实现观察者、被观察者接口

1
2
3
4
5
6
7
8
9
10
11
12
public interface Subject {
void registerObserver(Observer o); //注册观察者
void removeObserver(Observer o); //删除观察者
void notifyObservers(); //当被观察者状态改变时,通知所有观察者信息
}
public interface Observer {
//当被观察者的数据更新时,将更新的信息当做参数传递给观察者
void update(float temperature, float humidity, float pressure);
}
public interface DisplayElement {
void display(); //用于显示更新的数据
}

被观察者对象的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//被观察对象实现被观察接口
public class WeatherData implements Subject {
private ArrayList<Observer> observers;
private float temperature;
private float humidity;
private float pressure;

public WeatherData() {
observers = new ArrayList<Observer>();
}

@Override
public void registerObserver(Observer o) {
observers.add(o);
}

@Override
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}

public void notifyObservers() {
for (int i = 0; i < observers.size(); i++) {
Observer observer = observers.get(i);
observer.update(temperature, humidity, pressure);
}
}

public void measurementsChanged(){
notifyObservers();
}

public void setMeasurements(float temperature,float humidity,float pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
}

观察者被观察者逻辑的具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//观察者实现观察者接口和具体的数据展示
public class CurrentContionsDisplay implements Observer, DisplayElement {
private static final String TAG = "CurrentContionsDisplay";
private float temperature;
private float humidity;
private Subject weatherData;

public CurrentContionsDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}

@Override
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}

@Override
public void display() {
Log.d(TAG, "display: " + temperature + "::" + humidity);
}
}

使用实例:

1
2
3
WeatherData data = new WeatherData();
CurrentContionsDisplay display = new CurrentContionsDisplay(data);
data.setMeasurements(100,100,100);

代码地址

本文地址: http://www.yppcat.top/2019/02/07/观察者模式/