观察者模式(本文是subject主动向observer推送消息且是自定义观察者模式非java内置模式)定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的全部依赖者都会收到通知并自动更新。java
设计原则:为了实现交互对象之间的松耦合设计。ide
Subject接口:测试
package com.sun; public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); }
Subject接口的实现类WeatherData:this
package com.sun; import java.util.ArrayList; public class WeatherData implements Subject { private ArrayList observers; private float temperature; private float humidity; private float pressure; public WeatherData(){ observers = new ArrayList(); } @Override public void registerObserver(Observer o) { observers.add(o); } @Override public void removeObserver(Observer o) { int i = observers.indexOf(o); if(i>0){ observers.remove(i); } } @Override public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer oberver = (Observer)observers.get(i); oberver.update(temperature, humidity, pressure); } } //当从气象站获得更新观测值时,咱们通知观察者 public void measurementsChanged(){ notifyObservers(); } //利用下面这个方法测试布告板 public void setMeasurements(float temperature,float humidity,float pressure){ this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } }
Observer接口:设计
package com.sun; public interface Observer { public void update(float temp,float humidity,float pressure); }
Object接口的其中一个公布板实现类:code
package com.sun; public class CurrentConditionsDisplay implements Observer,DisplayElement{ private float temperature; private float humidity; private float pressure; private Subject weatherData; public CurrentConditionsDisplay(WeatherData weatherData) { this.weatherData = weatherData; weatherData.registerObserver(this); } @Override public void update(float temp, float humidity, float pressure) { this.temperature = temp; this.humidity = humidity; this.pressure = pressure; display(); } public void display(){ System.out.println("Current conditions:" + temperature + "F degrees and"+ humidity +" %humidity"); } }
DisplayElement公布板显示的接口:server
package com.sun; public interface DisplayElement { public void display(); }
测试类WeatherStation:对象
package com.sun; public class WeatherStation { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); weatherData.setMeasurements(80, 65, 30.4f); weatherData.setMeasurements(82, 70, 29.2f); } }