设计原则:
1.为了交互对象之间的松耦合设计而努力
观察者模式:
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新
场景:
气象站需要实时监控数据,数据发生变动的时候就会把参数传递给各个布告板,各个布告板也会有自己的实现方式,同时有可能会添加多个布告板,或者移除布告板
各个对象之间的关系:
image.png
如图所示我们需要的接口和实现类
image.png
1.被观察者
接口Subject.java
public interface Subject {
/**
* @功能:添加观察者
* @作者:jh @代号:金花
* @时间:2018年7月31日
*/
void registerObserver(Observer o);
/**
* @功能:移除观察者
* @作者:jh @代号:金花
* @时间:2018年7月31日
*/
void removeObserver(Observer o);
/**
* @功能:调用方法
* @作者:jh @代号:金花
* @时间:2018年7月31日
*/
void notifyObservers();
}
实现类WeatherData2.java
public class WeatherData2 implements Subject {
private List<Observer> obs = new ArrayList<>();
private String temperature;
private String humidity;
private String pressure;
public String getTemperature() {
return temperature;
}
public String getHumidity() {
return humidity;
}
public String getPressure() {
return pressure;
}
public void setTemperature(String temperature) {
this.temperature = temperature;
}
public void setHumidity(String humidity) {
this.humidity = humidity;
}
public void setPressure(String pressure) {
this.pressure = pressure;
}
public void measurementsChanged() {
notifyObservers(); // 调用
}
@Override
public void notifyObservers() {
// TODO Auto-generated method stub
for (Observer observer : obs) {
observer.update(this);
}
}
@Override
public void registerObserver(Observer o) {
// TODO Auto-generated method stub
obs.add(o);
}
@Override
public void removeObserver(Observer o) {
// TODO Auto-generated method stub
obs.remove(o);
}
}
2.观察者
接口Observer.java
public interface Observer {
void update(Subject s);
}
实现类CurrentConditionsDisplay.java
DisplayElement接口可有可无
public class CurrentConditionsDisplay implements DisplayElement,Observer{
/**
* @功能:显示天 气预报
* @作者:jh @代号:金花
* @时间:2018年7月31日
*/
@Override
public void display(WeatherData2 wd2) {
// TODO Auto-generated method stub
Console.json(wd2);
}
@Override
public void update(Subject s) {
// TODO Auto-generated method stub
if(s instanceof WeatherData2) {
WeatherData2 wd2 = (WeatherData2) s;
Console.json(wd2);
}
}
}
3.测试类
public class Test2 {
public static void main(String[] args) {
WeatherData2 wd2 = new WeatherData2();
wd2.setHumidity("35C");
wd2.setPressure("ppp");
wd2.setTemperature("mm");
Observer one = new CurrentConditionsDisplay();
Observer two = new ForecastDisplay();
Observer three = new StatisticsDisplay();
Observer four = new ThirdPartyDisplay();
wd2.registerObserver(one);
wd2.registerObserver(two);
wd2.registerObserver(three);
wd2.registerObserver(four);
wd2.notifyObservers();
Console.log("=======================");
wd2.removeObserver(one);
wd2.notifyObservers();
}
}
运行结果
image.png
网友评论