观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态是,它的所有依赖者都会收到通知,并自动更新。
画如下图理解定义:
根据分析,可以画出如下的UML类关系图:
实现代码如下,文件目录图:
主题接口:
package com.design.observer;
public interface Subject {
//添加观察者
public void addObserver(Observer observer);
//删除观察者
public void removeObserver(Observer observer);
}
天气情况(主题)
package com.design.observer;
import java.util.ArrayList;
import java.util.List;
public class WeatherSubject implements Subject{
//温度
private String temperature;
//湿度
private String humidity;
//气压
private String pressure;
private ArrayList observers;
public WeatherSubject(){
observers = new ArrayList();
}
//添加观察者
public void addObserver(Observer observer) {
observers.add(observer);
}
//删除观察者
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void changeWeather(){
Observer observer;
for(int i=0;i<observers.size();i++){
observer = (Observer)observers.get(i);
//通知观察者更新提前情况
observer.update(temperature, humidity, pressure);
}
}
//更新天气情况
public void setmeasureMents(String temperature,String humidity,String pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
changeWeather();
}
public String getTemperature() {
return temperature;
}
public void setTemperature(String temperature) {
this.temperature = temperature;
}
public String getHumidity() {
return humidity;
}
public void setHumidity(String humidity) {
this.humidity = humidity;
}
public String getPressure() {
return pressure;
}
public void setPressure(String pressure) {
this.pressure = pressure;
}
}
观察者接口:
package com.design.observer;
public interface Observer {
//更新天气情况
public void update(String temperature,String humidity,String pressure);
}
显示板(观察者,示例只实现其中一个显示板)
package com.design.observer;
public class DisplayPanel implements Observer{
//温度
private String temperature;
//湿度
private String humidity;
//气压
private String pressure;
//构造方法初始化
public DisplayPanel(Subject wheatherSuject){
wheatherSuject = new WeatherSubject();
}
//更新天气情况
public void update(String temperature,String humidity,String pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
display();
}
public void display(){
System.out.println("温度="+temperature+","+"湿度="+humidity+","+"气压="+pressure);
}
public String getTemperature() {
return temperature;
}
public void setTemperature(String temperature) {
this.temperature = temperature;
}
public String getHumidity() {
return humidity;
}
public void setHumidity(String humidity) {
this.humidity = humidity;
}
public String getPressure() {
return pressure;
}
public void setPressure(String pressure) {
this.pressure = pressure;
}
}
测试代码:
package com.design.observer;
public class ObserverTest {
public static void main(String[] args){
WeatherSubject weatherSubject = new WeatherSubject();
//引用,使得对象实例可以被传递
Observer displayPanel = new DisplayPanel(weatherSubject);
weatherSubject.addObserver(displayPanel);
weatherSubject.setmeasureMents("32", "40", "100");
}
}
测试结果:
最后,欢迎评论交流,如果有更好的建议,欢迎提出。