- 定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的多有依赖者都会收到通知并自动更新。
- 理解:观察者模式就是主题类状态发生改变的时,用一个公共的接口更新观察者状态。在使用观察者模式应该注重,多使用组合,少用继承;针对接口编程,不针对实现编程;降低对象之间的松耦合。
- 举例说明:
/**
* 观察者显示接口
* Created by 15692 on 2019/4/9.
*/
public interface DisplayElement {
void display();
}
/**
* 观察者接口
* Created by 15692 on 2019/4/9.
*/
public interface Observer {
void update(Map<String,Object> map);
}
/**
* 观察者类
* Created by 15692 on 2019/4/9.
*/
public class CurrentConditionalDisplay implements Observer, DisplayElement {
private Subject weatherData;
private float temperature;
private float humidity;
public CurrentConditionalDisplay(Subject weatherData) {
this.weatherData = weatherData;
this.weatherData.registerObjserver(this);
}
@Override
public void update(Map<String, Object> map) {
this.temperature = (float) map.get("temperature");
this.humidity = (float) map.get("humidity");
display();
}
@Override
public void display() {
System.out.println("Current Conditional:" + this.temperature + "F degrees and " + this.humidity + "% humidity");
}
}
/**
* 主题接口
* Created by 15692 on 2019/4/9.
*/
public interface Subject {
void registerObjserver(Observer o);
void removeObjserver(Observer o);
void notifyObservers(Map<String, Object> map);
}
/**
* 观察者类
* Created by 15692 on 2019/4/9.
*/
public class CurrentConditionalDisplay implements Observer, DisplayElement {
private Subject weatherData;
private float temperature;
private float humidity;
public CurrentConditionalDisplay(Subject weatherData) {
this.weatherData = weatherData;
this.weatherData.registerObjserver(this);
}
@Override
public void update(Map<String, Object> map) {
this.temperature = (float) map.get("temperature");
this.humidity = (float) map.get("humidity");
display();
}
@Override
public void display() {
System.out.println("Current Conditional:" + this.temperature + "F degrees and " + this.humidity + "% humidity");
}
}
4.时序图:
- java内置的观察者模式,在java的util包内含有Observer接口和Observerable类,它和前面示例的subject接口和Observer接口类似,只是功能更加强大,观察者的注册和删除在主题中不用多余的代码注册。