观察者模式

这个模式从字面上就很好理解了:肯定有一个观察的对象,然后有一群观察者。观察者模式我觉得更像是一种通知模式,当对象发生变化是,通知所有的观察者。

依然参用《Head First》的例子:

有一个气象站,测量温度(Temperature),湿度(Humidity),气压(Pressure)三个参数,有三个显示设备(观察者)。

首先可以分析一下:

1,肯定需要一个可供观察的对象WeatherData,这个对象肯定要有方法检测到三个参数的置,

2,这个对象肯定要维护一个观察者的队列;

3,这个对象肯定得有一个方法将参数变化通知所有观察者;

4,这个对象肯定有方法可以增加观察者或删除观察者。

5,所有观察者都有一个update方法。

具体程序如下:

//对象WeatherData的接口Subject

package Observer;

/**
 * Created by sgzhang on 2015/8/12.
 */
public interface Subject {
    void addObserver (Observer observer);
    void deleteObserver(Observer observer);
    void changeAll(float temp,float humidity,float pressure);//改变WeatherData
    void notifyAllObersers();
}
//WeatherData,采用了一个ArrayList维护观察者队列。

package Observer;


import java.util.ArrayList;
import java.util.List;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class WeatherData implements Subject {

    private float temp;
    private float humidity;
    private float pressure;
    private List<Observer> observersArray=new ArrayList<Observer>();

    public WeatherData(float temp, float pressure, float humidity) {
        this.temp = temp;
        this.pressure = pressure;
        this.humidity = humidity;
    }

    public float getPressure() {
        return pressure;
    }

    public float getHumidity() {
        return humidity;
    }

    public float getTemp() {
        return temp;
    }

    public void setTemp(float temp) {
        this.temp = temp;
    }

    public void setPressure(float pressure) {
        this.pressure = pressure;
    }

    public void setHumidity(float humidity) {
        this.humidity = humidity;
    }

    @Override
    public void changeAll(float temp,float humidity,float pressure){//改变WeatherData
        setTemp(temp);
        setHumidity(humidity);
        setPressure(pressure);
        notifyAllObersers();
    }

    @Override
    public void addObserver(Observer observer){
        observersArray.add(observer);
    }

    @Override
    public void deleteObserver(Observer observer) {
        observersArray.remove(observer);
    }

    @Override
    public void notifyAllObersers() {//通知所有观察者
        for(Observer obs : observersArray){
            obs.update(temp,humidity,pressure);
        }
    }
}
//所有的观察者都应该是观察者,这些观察者都具备update的能力

package Observer;

/**
 * Created by sgzhang on 2015/8/12.
 */
public interface Observer {
    void update(float temp,float humidity,float pressure);
}
//观察者1,Person1

package Observer;


/**
 * Created by sgzhang on 2015/8/12.
 */
public class Person1 implements Observer {
    @Override
    public void update(float temp, float humidity, float pressure) {
        System.out.println("Person1的气象参数为:"+temp+humidity+pressure);
    }
}
//观察者2,Person2

package Observer;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class Person2 implements Observer {
    @Override
    public void update(float temp, float humidity, float pressure) {
        System.out.println("Person2的气象参数为:"+temp+humidity+pressure);
    }
}
//观察者2,Person2

package Observer;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class Person3 implements Observer {
    @Override
    public void update(float temp, float humidity, float pressure) {
        System.out.println("Person3的气象参数为:"+temp+humidity+pressure);
    }
}

接下来是主函数了

//RunMain

package Observer;

/**
 * Created by sgzhang on 2015/8/12.
 */
public class RunMain {
    public static void main(String[] args){
        Subject weatherData=new WeatherData(0,0,0);
        Observer person1=new Person1();
        Observer person2=new Person2();
        Observer person3=new Person3();
        weatherData.addObserver(person1);
        weatherData.addObserver(person2);
        weatherData.addObserver(person3);
        weatherData.changeAll(1, 1, 1);
        System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
        weatherData.changeAll(2,2,2);
        System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
        weatherData.changeAll(3,3,3);
        System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
        weatherData.deleteObserver(person1);
        weatherData.changeAll(4,4,4);
        System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
    }
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值