观察者模式
什么是观察者模式?
- 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
观察者模式是一个一对多的关系,可以理解为报社与报纸的订阅者关系,报社看作主机(subject),则报纸的订阅者则课看作观察者(Observer),当报社发现新的消息时,所有报纸订阅者都会收到通知并得到新的报纸。
观察者模式中,主机与观察者之间,可以交互,但是不清楚彼此的细节,这种关系叫做松耦合。松耦合的设计将对象之间的互相依赖降到了最低,方便开发过程中的修改与扩展。
利用观察者模式实现气象站
气象站测量温度、湿度等数据,WetherData可以获取气象站测量得到的数据,布告板显示特定数据并及时更新。
//Subject接口
public interface Subject(){
public registerObservers(Observer o);
public removeObservers(Observer o);
public notifyObservers();
}
//观察者接口
public interface Observer(){
public void update(float temp);
}
//布告板接口
public interface DisplayElement(){
public void display();
}
//实现Subject的接口,WeatherData类
public class WeatherData implements Subject{
private ArrayList observers;
private float temp;
public WeatherData(){
observers = new ArrayList();
}
//省略实现
public registerObservers(Observer o);
public removeObservers(Observer o);
//广播
public notifyObservers(){
//对array中每一个observer
observer.update(temp);
}
public void measurementsChanged(){
notifyObservers();
}
public void setMeasurments(float temp){
this.temp=temp;
measurementsChanged();
}
}
//实现Observer和DisplyElement接口
public class ConditionDisplay implements Observer,DisplayElement{
private float temp;
private Subject weatherData;
pubilc ConditionDisply(Subject weatherData){
this.weatherData=weatherData;
weatherData.registerObservers(this);
}
public void update(float temp){
this.temp=temp;
display();
}
public void display(){
System.out.println();
}
}
//气象站实现
public class Station{
public static void main(String[] args){
WeatherData weatherData = new WeatherData();//建立一个数据中心
ConditionDisplay currentDisplay = new ConditionDisplay(weatherData);//建立一个布告板,并在数据中心登记。
weatherData.setMeasurements(20);
}
}
该气象站的实现既利用了观察者模式也利用了策略模式,理解起来有点费劲,但是把代码敲一遍之后,差不多就能理解了 。
《Head First 设计模式》