读书人

设计形式之二-观察者模式

发布时间: 2012-09-16 17:33:17 作者: rapoo

设计模式之二-----观察者模式

观察者模式由2部分组成?? 主题? 和? 观察者

1 主题接口

package com.observer;/*** *  * @author shasha * 观察者主题类 */public interface Subject {public void registObserver(Observer o);public void removeObserver(Observer o);public void notifyObservers();}

?

2 天气预报主题 (实现了主题接口)

package com.observer;import java.util.ArrayList;/** *  * @author shasha * 主题实现类---天气预报主题 */public class WeatherData implements Subject {private ArrayList<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData(){observers=new ArrayList<Observer>();}@Overridepublic void notifyObservers() {// TODO Auto-generated method stubfor(int i=0;i<observers.size();i++){Observer observer=observers.get(i);observer.update(temperature, humidity, pressure);}}@Overridepublic void registObserver(Observer o) {// TODO Auto-generated method stubobservers.add(o);}@Overridepublic void removeObserver(Observer o) {// TODO Auto-generated method stubint i=observers.indexOf(o);if(i>=0){observers.remove(o);}}public void setMeasurements(float temperature,float humidity,float pressure){this.temperature=temperature;this.humidity=humidity;this.pressure=pressure;measurementsChanged();}public void measurementsChanged(){notifyObservers();}}

?

?3 观察者接口

package com.observer;/** *  * @author shasha * 观察者 */public interface Observer {public void update(float temp,float humidity,float pressure);}

?

?

4 显示信息接口

package com.observer;/*** *  * @author shasha * 显示接口 * */public interface DisplayElement {public void display();}

?

?

5 观察者实现类----天气预报显示版

package com.observer;/*** *  * @author duwan * 天气预报显示板 */public class CurrentConditionDisplay implements DisplayElement,Observer{private float temperature;private float humidity;private Subject weatherdate;public CurrentConditionDisplay(Subject weatherdata){this.weatherdate=weatherdata;weatherdata.registObserver(this);}@Overridepublic void display() {// TODO Auto-generated method stubSystem.out.println("temperature: "+temperature+" F degress and"+humidity+"% humidity");}@Overridepublic void update(float temp, float humidity, float pressure) {// TODO Auto-generated method stubthis.temperature=temp;this.humidity=humidity;display();}}

?6 测试程序 气象站

package com.observer;/** *  * @author shasha * 气象站测试程序 */public class WeatherStation {public static void main(String[] args) {WeatherData weatherData=new WeatherData();CurrentConditionDisplay ccd=new CurrentConditionDisplay(weatherData);weatherData.setMeasurements(80, 65, 30.4f);}}

?

?

--------针对需求 可以在

public void measurementsChanged(){
??notifyObservers();
?}

增加一个setChange() 与java.util.Observser中一样 完成一定情况下才提醒观察者

读书人网 >软件开发

热点推荐