观察者模式定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有的依赖者都会收到通知并自动更新。
Subject是我们的主题接口,他有三个方法,一个是注册观察者,一个是删除观察者,另一个是通知观察者。当主题状态改变时,这个方法会被调用,以通知所有的观察者。
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer o);
public void notifyObservers();
}
Observer是我们的观察者接口,所有的观察者都要实现update()方法,以实现观察者接口。当气象观测值改变时,主题会把这些状态值当作方法的参数,传送给观察者。
public interface Observer {
public void update(float temperature,float humidity,float pressure);
}
DisplayElement是我们的显示气象信息的接口,它只包含了一个方法也就是display()。当布告板要显示时,调用此方法。所有的布告板都要实现这个接口。
public interface DiplayElement {
public void display();
}
这里要说的是uodate()方法,这个方法直接传进去了三个参数,这样的设计可能不太附合要求,因为你不能确定这三个参数就已经够用了不用再改了,万万一要改起来那就你就要回过头来修改之前的方法,这样就有悖我们的类的设计:对扩展开放,对修改关闭。所以有必要的话就用个javaBean类来封装,对update()方法直接传javaBean类。如:
public class TemperatureBean {
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;
}
}
以后要加属性就加好了。update(TemperatureBean bean);
WeatherData类是实现了主题的类,主要的作用就是对观察者的添加删除和通知。
public class WeatherData implements Subject{
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData(){
observers = new ArrayList();
}
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();
}
public void setMeasurements(float temperature,float humidity,float pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if(i > 0){
observers.remove(o);
}
}
}
现在该是实现布告类了:
public class CurrentConditionsDiplay implements Observer,DiplayElement{
private float temperature;
private float humidity;
private Subject weatherDataSubject;
public CurrentConditionsDiplay(Subject weatherDataSubject){
this.weatherDataSubject = weatherDataSubject;
weatherDataSubject.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
public class ForecastDisplay implements Observer,DiplayElement{
private float temperature;
private float humidity;
private Subject weatherDataSubject;
public ForecastDisplay(Subject weatherDataSubject){
this.weatherDataSubject = weatherDataSubject;
weatherDataSubject.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
public class ThirdPartyDisplay implements Observer,DiplayElement{
private float temperature;
private float humidity;
private Subject weatherDataSubject;
public ThirdPartyDisplay(Subject weatherDataSubject){
this.weatherDataSubject = weatherDataSubject;
weatherDataSubject.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
测试一下:
public class Test1 {
/**
* @param args
*/
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDiplay displayConditionsDiplay = new CurrentConditionsDiplay(weatherData);
weatherData.setMeasurements(25,20,35F);
}
}
当然我们可以用java内置的观察模式Observer实现
jar cvf test.jar com
test.jar=要生成的jar文件名
com=总路径下面可能有路径test1,test2,test3等
Subject是我们的主题接口,他有三个方法,一个是注册观察者,一个是删除观察者,另一个是通知观察者。当主题状态改变时,这个方法会被调用,以通知所有的观察者。
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer o);
public void notifyObservers();
}
Observer是我们的观察者接口,所有的观察者都要实现update()方法,以实现观察者接口。当气象观测值改变时,主题会把这些状态值当作方法的参数,传送给观察者。
public interface Observer {
public void update(float temperature,float humidity,float pressure);
}
DisplayElement是我们的显示气象信息的接口,它只包含了一个方法也就是display()。当布告板要显示时,调用此方法。所有的布告板都要实现这个接口。
public interface DiplayElement {
public void display();
}
这里要说的是uodate()方法,这个方法直接传进去了三个参数,这样的设计可能不太附合要求,因为你不能确定这三个参数就已经够用了不用再改了,万万一要改起来那就你就要回过头来修改之前的方法,这样就有悖我们的类的设计:对扩展开放,对修改关闭。所以有必要的话就用个javaBean类来封装,对update()方法直接传javaBean类。如:
public class TemperatureBean {
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;
}
}
以后要加属性就加好了。update(TemperatureBean bean);
WeatherData类是实现了主题的类,主要的作用就是对观察者的添加删除和通知。
public class WeatherData implements Subject{
private ArrayList observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherData(){
observers = new ArrayList();
}
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();
}
public void setMeasurements(float temperature,float humidity,float pressure){
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
measurementsChanged();
}
public void registerObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if(i > 0){
observers.remove(o);
}
}
}
现在该是实现布告类了:
public class CurrentConditionsDiplay implements Observer,DiplayElement{
private float temperature;
private float humidity;
private Subject weatherDataSubject;
public CurrentConditionsDiplay(Subject weatherDataSubject){
this.weatherDataSubject = weatherDataSubject;
weatherDataSubject.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
public class ForecastDisplay implements Observer,DiplayElement{
private float temperature;
private float humidity;
private Subject weatherDataSubject;
public ForecastDisplay(Subject weatherDataSubject){
this.weatherDataSubject = weatherDataSubject;
weatherDataSubject.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
public class ThirdPartyDisplay implements Observer,DiplayElement{
private float temperature;
private float humidity;
private Subject weatherDataSubject;
public ThirdPartyDisplay(Subject weatherDataSubject){
this.weatherDataSubject = weatherDataSubject;
weatherDataSubject.registerObserver(this);
}
public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
public void display() {
System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
}
}
测试一下:
public class Test1 {
/**
* @param args
*/
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionsDiplay displayConditionsDiplay = new CurrentConditionsDiplay(weatherData);
weatherData.setMeasurements(25,20,35F);
}
}
当然我们可以用java内置的观察模式Observer实现
jar cvf test.jar com
test.jar=要生成的jar文件名
com=总路径下面可能有路径test1,test2,test3等