认识观察者模式
我们看看报纸和杂志的订阅是怎么回事:
1.报社的业务是出版报纸。
2.向某家报订阅报纸,只要他有新报纸出版,就会给你送来。只要你是他们的用户,你就会一直收到新报纸。
3.当你不想看报纸的时候,取消订阅,他们就不会再送新报纸来。
4.只要报社还在运营,就会一直人(或单位)向他们订阅报纸或取消订阅报纸。
出版者+订阅者=观察者模式
如果你了解报纸的订阅是怎么回事,其实就知道观察者模式是怎么回事,只是名称不太一样:出版者改称为“主题”(Subject),订阅者改称为“观察者”(Observer)。
让我们来看得更仔细一点:
定义观察者模式
当你试图勾勒观察者模式时,可以利用报纸订阅服务,以及出版者和订阅者比拟这一切。
在真实的世界中,你通常会看到观察者模式被定义成:
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
难察者模式定义了一系列对象之间的一对多关系。 当一个对象改变状态,其他依赖者都会收到通知。
主题和观察者定义了一对多的关系。观察者依赖子此主题,只要主题状态一有变化,观察者就会被通知。根据通知的风格,观察者可能因此新值而更新。
稍后你会右到,实现观察者模式的方法不只一种,但是以包含Subject与Observer接口的类设计的做法最常见。
实例:
气象监测应用的概况
此系统中的三个部分是气象站(获取实际气象数据的物理装置),WeatherDate对象(追踪来自气象站的数据,并更新布告栏)和布告栏
WeatherData对象知道如何跟物理气象站联系,以取得更新的数据。WeatherData对象会随即更新三个布告板的显示:目前状况(温度、湿度、气压)、气象统计和天气预报。
如果我们选择接受这个项目,我们的工作就是建立一个应用,利用WeatherData对象取得数据,并更新三个布告板:目前状况.气象统计和天气预报。
布告栏(观察者),WeatherData对象(主题)
Observer.java
public interface Observer {
public void update(float temp, float humidity,float pressure);
}
复制代码
subject.java
public interface subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
复制代码
DisplayElement.java
public interface DisplayElement {
public void display();
}
复制代码
CurrentConditionDisplay.java
public class CurrentConditionDisplay implements Observer,DisplayElement{
private float temp;
private float humidity;
private float pressure;
private subject WeatherData;
CurrentConditionDisplay(WeatherData a){
this.WeatherData=a;
a.registerObserver(this);
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("temp="+temp+"\nhumidity="+humidity+"\npressure="+pressure);
}
@Override
public void update(float temp, float humidity, float pressure) {
// TODO Auto-generated method stub
this.pressure=pressure;
this.humidity=humidity;
this.temp=temp;
display();
}
}
复制代码
Observer.java
public interface Observer {
public void update(float temp, float humidity,float pressure);
}
复制代码
Test.java
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
WeatherData w=new WeatherData();
CurrentConditionDisplay a=new CurrentConditionDisplay(w);
w.setMeasurements(80, 30, 4);
w.setMeasurements(8, 3, 4);
}
}
复制代码
最后
后续还会更新其它设计模式,有错欢迎提出,谢谢!