观察者模式应用比较广泛,写一个简单的示例,扩展了一下Head First上面例子的应用范围,进一步降低Observer与Subject之间的耦合度。 简单例子,直接给代码: package test; public interface Subject { public void registerObserver(Observer observer); public void unRegisterObserver(Observer observer); public void notifyAllObservers(); public void notifyObserver(Observer observer); } package test; public interface Observer { public void registerSubject(Subject subject); public void unRegisterSubject(Subject subject); public void update(Subject subject); } package test; import java.util.ArrayList; import java.util.List; public class WeatherDataSubject implements Subject { List<Observer> observers = new ArrayList<Observer>(); private float temperature; private float humidity; private float pressure; public float getTemperature() { return temperature; } public void setTemperature(float temperature) { this.temperature = temperature; } public float getHumidity() { return humidity; } public void setHumidity(float humidity) { this.humidity = humidity; } public float getPressure() { return pressure; } public void setPressure(float pressure) { this.pressure = pressure; } @Override public void registerObserver(Observer observer) { // TODO Auto-generated method stub if(!observers.contains(observer)) observers.add(observer); } @Override public void unRegisterObserver(Observer observer) { // TODO Auto-generated method stub if(observers.contains(observer)) observers.remove(observer); } @Override public void notifyAllObservers() { // TODO Auto-generated method stub for(Observer o:observers) o.update(this); } @Override public void notifyObserver(Observer observer) { // TODO Auto-generated method stub if(observers.contains(observer)) observer.update(this); } public void setWeatherDataParameters(float temperature,float humidity,float pressure) { this.setTemperature(temperature); this.setHumidity(humidity); this.setPressure(pressure); this.notifyAllObservers(); } } package test; public class DisplayPanel implements Observer { private float temperature; private float humidity; private float pressure; public float getTemperature() { return temperature; } public void setTemperature(float temperature) { this.temperature = temperature; } public float getHumidity() { return humidity; } public void setHumidity(float humidity) { this.humidity = humidity; } public float getPressure() { return pressure; } public void setPressure(float pressure) { this.pressure = pressure; } @Override public void registerSubject(Subject subject) { // TODO Auto-generated method stub subject.registerObserver(this); } @Override public void unRegisterSubject(Subject subject) { // TODO Auto-generated method stub subject.unRegisterObserver(this); } @Override public void update(Subject subject) { // TODO Auto-generated method stub if(subject instanceof WeatherDataSubject) { WeatherDataSubject s = (WeatherDataSubject)subject; this.setTemperature(s.getTemperature()); this.setHumidity(s.getHumidity()); this.setPressure(s.getPressure()); } this.display(); } public void display() { System.out.println("Temperature:"+this.getTemperature()); System.out.println("Humidity:"+this.getHumidity()); System.out.println("Pressure:"+this.getPressure()); } } package test; public class Driver { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub WeatherDataSubject subject1=new WeatherDataSubject(); WeatherDataSubject subject2=new WeatherDataSubject(); Observer panel1 = new DisplayPanel(); Observer panel2 = new DisplayPanel(); panel1.registerSubject(subject1); panel1.registerSubject(subject2); panel2.registerSubject(subject2); subject1.setWeatherDataParameters(15.0f, 0.32f, 1076.23f); subject2.setWeatherDataParameters(13.5f, 0.42f, 1087.11f); System.out.println("Subject1:======================"); subject1.notifyAllObservers(); System.out.println("Subject2:======================"); subject2.notifyAllObservers(); } }