观察者模式图和代码实现

观察者模式定义了对象之间的一对多的依赖,这样一来,当一个对象改变状态时,它的所有的依赖者都会收到通知并自动更新。
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等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值