最近在看Header First 设计模式,感觉收获很大,就把其中的例子,用代码记录下。
出版者+订阅者=观察者模式
出版者--Subject
订阅者--Observer
以气象站公告板为例
温度感应装置|
| 取得数据 显示
湿度感应装置|---- 气象站<--------------WeatherData对象-------->|显示装置
|
气压感应装置|
主题接口
package com.mq.designmode.observer; public interface Subject { public void registerObserver(Object object); public void removeObserver(Object object); public void notifyObservers(); }
观察者接口
package com.mq.designmode.observer; public interface Observer { public void update(float temp, float humidity, float pressure); }
package com.mq.designmode.observer; public interface DisplayElement { public void display(); }
具体实现类
主题实现类
package com.mq.designmode.observer; import java.util.ArrayList; public class WeatherData implements Subject { //温度 private float temperature; //湿度 private float humidity; //压力 private float pressure; private ArrayList observers; public WeatherData(){ observers = new ArrayList(); } @Override public void registerObserver(Object object) { observers.add(object); } @Override public void removeObserver(Object object) { int i = observers.indexOf(object); if(i >= 0){ observers.remove(i); } // observers.remove(object); } @Override public void notifyObservers() { for(int i = 0; i < observers.size(); i++){ Observer observer = (Observer) observers.get(i); observer.update(temperature, humidity, pressure); } } public void measurementsChanged(){ notifyObservers(); } /** * 设置具体条件值 * @param temperature * @param humidity * @param pressure */ public void setMeasurements(float temperature, float humidity, float pressure){ this.temperature = temperature; this.humidity = humidity; this.pressure = pressure; measurementsChanged(); } //其它方法 } 观察者实现类
package com.mq.designmode.observer; public class CurrentConditionsDisplay implements Observer, DisplayElement { private float temperature; private float humidity; private Subject weatherData; public CurrentConditionsDisplay(Subject subject) { this.weatherData = subject; this.weatherData.registerObserver(this); } @Override public void update(float temp, float humidity, float pressure) { this.temperature = temp; this.humidity = humidity; display(); } @Override public void display() { System.out.println("Current condition: "+ temperature + " F degrees and " + humidity +"% humidity "); } }
测试类
package com.mq.designmode.observer; public class WeatherStation { /** * 出版者+订阅者=观察者模式 * */ public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData); weatherData.setMeasurements(22, 25 ,50); weatherData.setMeasurements(32, 35 ,56); weatherData.setMeasurements(18, 45 ,60); } }
运行结果:
设计原则:针对接口编程,不针对实现编程
设计原则:多用组合,少用继承
设计原则:找出程序中会变化的方面,然后将其与固定不变的方面相分离