Headfirst java设计模式-观察者模式

观察者模式:在状态之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖他的对象会都收到通知,并改变状态。

代码实现:
1.采用自定义的observer和observable(subject)接口
(1)创建subject和observer两个接口,以及布告板接口

public interface Observer {
    public void update(float temp, float humidity, float pressure);
}

public interface Subject {
    public void registerObserver(Observer o); 
    public void removeObserver(Observer o);
    public void notifityObservers();
}

public interface DisplayElements {
    public void display();
}

(2)继承subject接口实现weatherData类

import java.util.ArrayList;

public class WeatherData implements Subject{
    private ArrayList observers;
    private float temp;
    private float humidity;
    private float pressure;

    public WeatherData(){
        observers = new ArrayList();
    }

    @Override
    public void registerObserver(Observer o) {
        // TODO Auto-generated method stub
        observers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        // TODO Auto-generated method stub
        int i = observers.indexOf(o);
        if (i > 0) {
            observers.remove(o);
        } 
    }

    @Override
    public void notifityObservers() {
        // TODO Auto-generated method stub
        for (int i = 0; i < observers.size(); i++) {
            Observer observer = (Observer) observers.get(i);
            observer.update(temp, humidity, pressure);
        }
    }

    public void meassurementChanged() {
        notifityObservers();
    }

    public void setMeassurement(float temp, float humidity, float pressure) {
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure;
        meassurementChanged();
    }
}

(3)继承observer以及DisplayElements 实现布告板类

public class CurrentConditionDisplay implements DisplayElements, Observer{
    private float temp;
    private float humidity;
    private Subject weatherData;

    public CurrentConditionDisplay(Subject weatherData){
        this.weatherData = weatherData;
        weatherData.registerObserver(this);
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        // TODO Auto-generated method stub
        this.temp = temp;
        this.humidity = humidity;
        display();
    }

    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("Current condition:" + temp + "F degrees and " + humidity + "% humidity");
    }
}

(4)测试代码

public class WeatherStation {
    public static void main(String[] args){
        WeatherData weatherData = new WeatherData();
        CurrentConditionDisplay currrentDisplay = new CurrentConditionDisplay(weatherData);

        weatherData.setMeassurement(80, 65, 30.4f);
        weatherData.setMeassurement(82, 70, 29.2f);
        weatherData.setMeassurement(78, 90, 29.2f);
    }
}

2.采用java本身的observer和observable接口
(1)继承java的observable接口实现WeatherData类

import java.util.ArrayList;
import java.util.Observer;
import java.util.Observable;

public class WeatherData extends Observable{
    private float temp;
    private float humidity;
    private float pressure;

    public WeatherData(){}




    public void meassurementChanged() {
        setChanged();
        notifyObservers();
    }

    public void setMeassurement(float temp, float humidity, float pressure) {
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure;
        meassurementChanged();
    }

    public float getTemperature(){
        return temp;
    }

    public float getHumidity(){
        return humidity;
    }

    public float getPressure(){
        return pressure;
    }

}

(2)继承Observer接口实现CurrentConditionDisplay 类

import java.util.Observer;
import java.util.Observable;

import com.observerpattern.custom.DisplayElements;

public class CurrentConditionDisplay implements DisplayElements, Observer{
    private Observable observable;
    private float temp;
    private float humidity;

    public CurrentConditionDisplay(Observable observable){
        this.observable = observable;
        observable.addObserver(this);
    }



    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("Current condition:" + temp + "F degrees and " + humidity + "% humidity");
    }



    @Override
    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        System.out.println("update weatherdata");
        if(o instanceof WeatherData) {
            WeatherData  weatherData = (WeatherData)o;
            this.temp = weatherData.getTemperature();
            this.humidity = weatherData.getHumidity();
            display();
        }
    }
}

(3)测试代码

public class WeatherStation {
    public static void main(String[] args){
        WeatherData weatherData = new WeatherData();
        CurrentConditionDisplay currrentDisplay = new CurrentConditionDisplay(weatherData);

        weatherData.setMeassurement(80, 65, 30.4f);
        weatherData.setMeassurement(82, 70, 29.2f);
        weatherData.setMeassurement(78, 90, 29.2f);
    }
}

猜你喜欢

转载自blog.csdn.net/MoonShinesOnMyWay/article/details/81367329