观察者模式分为两块
- 消息中心
- 订阅者
大体模式为,订阅者在消息中心订阅自己喜欢的主题。当订阅的主题发生变化时,消息中心会推送相应的更新消息到订阅者手中。这里消息中心中可以有很多主题。这边只拿一个主题来举例。
主题接口中,提供方法供给订阅者订阅主题,和取消订阅主题、以及一个通知所有订阅者的通知方法
package com.chapter.two;
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
而订阅者就相对简单,只有一个通知推送方法供主题去推送
package com.chapter.two;
public interface Observer {
void update();
}
对于主题接口的具体实现主题,实现起来也相对简单,维护一个订阅者的集合
package com.chapter.two;
import java.util.ArrayList;
import java.util.List;
public class WeatherData implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
private boolean status = false;
//设置一个状态,当想要更新的时候,必须先要去把状态字段置为true
public void setStatus() {
this.status = true;
}
//当需要推送消息时,先判断一把状态,如果状态正常,就去推送给所有的订阅者
public void setChanges(){
if(status){
notifyObservers();
}
status = false;
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer sObserver : observers) {
//这里为具体实现订阅者的update方法
sObserver.update();
}
}
}