学习与Head+First设计模式书上的。
观察者模式定义:定义一组一对多的对象,当一个对象改变,其他依赖它的对象也会收到通知。
起因:因为一个对象改变 结果:导致依赖它的对象全部收到通知。
解决了什么问题: 解决了当对象的状态发生改变时,能够将这种改变传递给订阅了当前对象的对象。而同时松耦合,可拓展。
使用场景: 报社和订阅报纸的人,以及明星被粉丝关注。这就牵涉到推,拉模式。
被订阅的对象叫: 主题
许多订阅对象: 观察者。 (报社就是主题,订阅报纸的人是观察者)(明星是主题,粉丝是观察者)
下面是书上的关于 天气平台被布告板所订阅的demo
能让大家有所学习,请点赞,嘻嘻
/*
主题
*/
public interface Subject {
// 注册观察者
void registerObserver(Observer o);
// 删除观察者
void removeObserver(Observer o);
// 通知
void notifyObserver();
}
/*
观察者对象所实现的接口
*/
public interface Observer {
// 观察者更新操作
void update(int temp,int hum,int pressure);
}
/*
布告板接口
*/
public interface Display {
void display();
}
/*
天气观察站
*/
public class WeatherDate implements Subject {
private List<Observer> observers;
private int temp;
private int hum;
private int pressure;
public WeatherDate() {
observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObserver() {
for (int i = 0;i < observers.size();i++) {
Observer observer = (Observer)observers.get(i);
observer.update(temp,hum,pressure);
}
}
// 事件触发
public void measurementsChanged() {
notifyObserver();
}
public void setWheather(int temp,int hum,int pressure) {
this.temp = temp;
this.hum = hum;
this.pressure = pressure;
measurementsChanged();
}
}
public class CurrentDisplay implements Observer,Display {
private int temp;
private int hum;
private int pre;
@Override
public void display() {
System.out.println("temp:"+temp + " "+"hum:"+" "+"pre:"+pre);
}
@Override
public void update(int temp, int hum, int pressure) {
this.temp =temp;
this.hum = hum;
this.pre = pressure;
display();
}
}