《Head First设计模式》笔记整理...欢迎交流...编程
定义对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的全部依赖者都会收到通知并自动更新。
松耦合:当两个对象之间松耦合,他们依然能够交互,可是不太清楚彼此的细节。
观察者模式让主题和对象之间松耦合。设计模式
为何呢?测试
关于观察者的一切,主题只知道观察者实现看某个接口(即Observer接口)。主题不须要知道观察值是谁,作了些什么或其余任何细节。this
已知由气象站提供WeatherData对象,用来追踪目前的天气情况(温度、湿度、气压)。咱们须要创建三个布告板(目前情况、气象统计、天气预报),分别显示目前的情况。而且要求此应用是能够扩展的。spa
public interface Subject { public void registerObserver(Observer o); //传入一个观察者变量,用来注册观察者 public void registerObserver(Observer o); //传入一个观察者变量,用来删除观察者 public void notifyObserver(); //当主题状态改变时,通知观察者 } public interface Observer { // 全部的观察者都必须实现update方法,以实现观察者接口 public void update(float temp, float humidity, float pressure); //当气象状态值改变时,主题会把这些状态值当作方法的参数,传递给观察者 } public interface DisplayElement { public void display(); // DisplayElement接口只包含一个方法,那就是display。当不高者须要显示时,调用此接口 }
在weatherData中实现主题接口设计
public class WeatherData implements Subject { private ArrayList observers; private float temoerature; // 温度 private float humidity; // 湿度 private float pressure; // 气压 public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { int i = observers.indexof(o); if(i >= 0) { observers.remove(o); } } public void notifyObserver(Observer o) { for(int i = 0; i < observers.size(); i++) { Observer observer = (Observer) observers.get(i); observers.update(temoerature, humidity, pressure); } } public void measurementsChanged() { notifyObservers(); // 当从气象站获得耿勋观测值时,咱们通知观察者 } public void setMeasurements(float temoerature, float humidity, float pressure) { // 这是一个测试方法 this.temoerature = temoerature; this.humidity = humidity; this.pressure = pressure; this.measurementsChanged(); } //WeatherData的其它方法 }
下面创建布告板code
public class CurrentConditionDisplay inplements Observer, DsiplayElement { privete float temperature; private float humidity; private Subject weatherData; public CurrentConditionDisplay(Subject weatherDate) { //构造器须要WeatherData对象 this.weatherDate = weatherDate; weatherDate.registerOvserver(this); } public void update(temperature, humidity, weatherData) { this.temperature = temperature; this.humidity = humidity; this.display(); } public void display() { System.out.print("Current conditions:" + this.temperature + "F degrees and " + this.humidity + "% humidity"); } }