气象部门获得天气情况之后,会通过一些显示屏显示当前的天气的信息,假设这个气象部门是一个对象,每个显示屏也是一个对象,那么气象部门当得知天气情况,或者天气变化的时候,应该通知显示屏,更改当前显示内容,那么气象部门就起着一个获取当前天气数据,然后通知显示屏更改显示数据内容的作用,如图一。
图一
为了说明问题,我们将温度,湿度,气压分成三个显示状态来显示,在进行设计的时候还存在几个问题,就是气象站怎么知道我要通知谁?那么这个就需要显示屏对象到气象站对象这里进行登记,以便发生气候变化的时候进行通知,有时候不想被通知的时候,进行注销就好了,类图如图二。
图二
public interface IObservable {
public void regist(IObserver iObserver);
public void remove(IObserver iObserver);
public void notifyObserves();
public void setMessage(double...args);
}
public interface IObserver {
public void update(IObservable weatherData);
public void show();
}
public class HmanityObserver implements IObserver {
private IObservable iObservable=null;
private double humanity;
public void update(IObservable iObservable) {
WeatherData weatherData=(WeatherData) iObservable;
this.humanity=weatherData.getHumanity();
show();
}
public void show() {
System.err.println("现在的湿度是:"+humanity);
}
public HmanityObserver(IObservable iObservable){
this.iObservable=iObservable;
iObservable.regist(this);
}
public void delete(){
iObservable.remove(this);
this.iObservable=null;
}
}
public class PressureObserver implements IObserver{
private IObservable iObservable=null;
private double pressure;
public void update(IObservable iObservable) {
WeatherData weatherData=(WeatherData) iObservable;
this.pressure=weatherData.getPressure();
show();
}
public void show() {
System.err.println("现在的压力是:"+pressure);
}
public PressureObserver(IObservable iObservable){
this.iObservable=iObservable;
iObservable.regist(this);
}
public void delete(){
iObservable.remove(this);
this.iObservable=null;
}
}
public class TemperatureObserver implements IObserver{
private IObservable iObservable=null;
private double temperature;
public void update(IObservable iObservable) {
WeatherData weatherData=(WeatherData) iObservable;
this.temperature=weatherData.getTemperature();
show();
}
public void show() {
System.err.println("现在的温度是:"+temperature);
}
public TemperatureObserver(IObservable iObservable){
this.iObservable=iObservable;
iObservable.regist(this);
}
public void delete(){
iObservable.remove(this);
this.iObservable=null;
}
}
public class WeatherData implements IObservable{
private double humanity;
private double pressure;
private double temperature;
List<IObserver>observers=null;
public double getHumanity() {
return humanity;
}
public double getPressure() {
return pressure;
}
public double getTemperature() {
return temperature;
}
@Override
public void regist(IObserver iObserver) {
//进行注册
observers.add(iObserver);
}
@Override
public void remove(IObserver iObserver) {
//进行注销
observers.remove(iObserver);
}
@Override
public void notifyObserves() {
//通知所有观察者
for(int i=0;i<observers.size();i++){
IObserver observer=observers.get(i);
observer.update(this);
}
}
public WeatherData(){
this.observers=new ArrayList<IObserver>();
}
@Override
public void setMessage(double... args) {
// TODO Auto-generated method stub
this.humanity=args[0];
this.pressure=args[1];
this.temperature=args[2];
notifyObserves();
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
WeatherData weatherData=new WeatherData();
PressureObserver pressureObserver=newPressureObserver(weatherData);
HmanityObserver humanHmanityObserver=newHmanityObserver(weatherData);
TemperatureObserver temperatureObserve=null;
temperatureObserver=newTemperatureObserver(weatherData);
weatherData.setMessage(10,11,12);
}
}
注意:上面的代码和类图,均是自己根据HeadFirst讲解,再加上自己的理解实现的,所以可能有不正确的地方,为了版面我没有导包了,同时我采用的是拉的方式,也可以改程推的方式。