观察者模式 又叫 发布--订阅模式,这个叫法比较恰当。
订阅者订阅某内容,若内容做出改变,这推送给每位订阅了的用户。
这是一种 一对多的 依赖关系。主题对象的在状态上发生变坏,会通知所有的观察者。
在学习观察者模式是,遇到一个新词, 低耦合。
低耦合:
及减少对象与对象的之间的链接。但同时不能忽略必要的链接,耦合对象间能够维持协调一致。
以后应该会对低耦合有更深的了解。
推送模型:
不知道观察者需要什么数据,把全部数据都推送出去。
import java.util.ArrayList;
public class Weather implements Subject {
public ArrayList<Observer> observers = new ArrayList<Observer>();
public double tempertaure;
public void setTempertaure(double tempertaure) {
this.tempertaure = tempertaure;
notifyObervers();
}
@Override
public void regisyOberver(Observer observer) {
observers.add(observer);
}
@Override
public void removeOberver(Observer observer) {
if (observers.contains(observer)) {
observers.remove(observer);
}
}
@Override
public void notifyObervers() {
for (Observer observer : observers) {
observer.update(tempertaure);
}
}
}
public class Condition implements Observer{
private double temperature;
@Override
public void update(double tempertaure) {
this.temperature = tempertaure;
}
}
拉模型:
把自己整个对象传出去,需要的数据自己 get 获取
import java.util.Observable;
public class WeatherData extends Observable {
private double temperature;
public WeatherData() {
}
public void menasuermentChaged(){
setChanged();
notifyObservers("hello");
}
public void setMeasurements(double temp) {
this.temperature = temp;
menasuermentChaged();
}
public double getTemperature() {
return temperature;
}
}
import java.util.Observable;
import java.util.Observer;
public class CurrentConditionsDisplay implements Observer {
private double temperature;
@Override
public void update(Observable o, Object arg) {
if (o instanceof WeatherData) {
WeatherData weatherData = (WeatherData) o;
this.temperature = weatherData.getTemperature();
System.out.println(arg);
}
}
}
拉模型使用的jdk 内置的观察者模式支持。 被观察者实现 Observable 类。
传输数据是吧自己整个给传出去,overser 获取数据是 使用get 方法获取自己想要的数据。
具体的给每个观察者传输数据
都是把每个订阅或注册过的用户都存 以个集合中,然后再遍历集合传数据。