美文网首页
观察者模式

观察者模式

作者: 隔壁丨王大爷 | 来源:发表于2018-06-07 16:27 被阅读5次

    定义:定义了对象之间一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新
    类图

    image.png

    案例:布告板实时显示温度。
    建立主题接口

    public interface Subject {
        void registerObserver(Observer O);
        void removeObserver(Observer O);
        void notifyObserver();
    
    }
    
    

    建立观察者接口

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

    建立显示接口

    public interface DisplayElement {
        void display();
    }
    
    

    定义被观察者

    public class WeatherData implements Subject {
        private ArrayList<Observer> observers;
        private float temperature;
        private float humidity;
        private float pressure;
    
        WeatherData(){
            observers = new ArrayList<>();
        }
        @Override
        public void registerObserver(Observer o) {
            observers.add(o);
        }
    
        @Override
        public void removeObserver(Observer o) {
            int i = observers.indexOf(o);
            if(i >= 0){
                observers.remove(i);
            }
    
        }
    
        @Override
        public void notifyObserver() {
            for (Observer observer:observers){
                observer.update(temperature,humidity,pressure);
            }
        }
    
        public void measurementsChanged(){
            notifyObserver();
        }
    
        public void setMessurements(float temperature,float humidity,float pressure){
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            measurementsChanged();
        };
    }
    
    

    定义观察者

    public class CurrentConditionDisplay implements Observer,DisplayElement {
    
        private float temperature;
        private float humidity;
        private WeatherData weatherData;
        CurrentConditionDisplay(WeatherData weatherData){
            this.weatherData = weatherData;
            weatherData.registerObserver(this);
        }
        public void logOut(){
            weatherData.removeObserver(this);
        }
        @Override
        public void display() {
            System.out.println("Current conditions :" + temperature+"F degrees and " + humidity+"% humdity");
        }
    
        @Override
        public void update(float temp, float humidity, float pessure) {
            this.temperature = temp;
            this.humidity = humidity;
            display();
        }
    }
    
    

    测试类

    public class Test {
        public static void main(String[] args){
            WeatherData weatherData = new WeatherData();
            CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(weatherData);
            weatherData.setMessurements(80,65,30.4f);
            weatherData.setMessurements(83,60,30.1f);
            currentConditionDisplay.logOut();
            weatherData.setMessurements(85,62,30.3f);
        }
    }
    

    java内置的观察者模式

    java.util包内包含最基本的Observer接口和Observable类。
    修改后的观察者类

    public class CurrentConditionDisplay implements Observer, DisplayElement {
    
        Observable observable;
        private float temperature;
        private float humidity;
        private WeatherData weatherData;
        CurrentConditionDisplay(Observable observable){
           this.observable = observable;
           observable.addObserver(this);
        }
    
        @Override
        public void display() {
            System.out.println("Current conditions :" + temperature+"F degrees and " + humidity+"% humdity");
        }
    
        @Override
        public void update(Observable obs,Object arg) {
            if(obs instanceof WeatherData){
                WeatherData weatherData = (WeatherData) obs;
                this.temperature = weatherData.getTemperature();
                this.humidity = weatherData.getHumidity();
                display();
            }
        }
    }
    

    修改后的被观察者类

    public class WeatherData extends Observable {
    
        private float temperature;
        private float humidity;
        private float pressure;
    
        public void measurementsChanged(){
            setChanged();
            notifyObservers();
        }
    
        public void setMessurements(float temperature,float humidity,float pressure){
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            measurementsChanged();
        };
    
        public float getTemperature() {
            return temperature;
        }
    
        public float getHumidity() {
            return humidity;
        }
    
        public float getPressure() {
            return pressure;
        }
    }
    

    java内置观察者的缺点:
    1、Observable是一个类,使得被观察者无法继承其他的超类。
    2、Observable将关键方法保护起来。

    相关文章

      网友评论

          本文标题:观察者模式

          本文链接:https://www.haomeiwen.com/subject/xfgwsftx.html