zoukankan      html  css  js  c++  java
  • 观察者模式(jdk实现)

    1.定义

    在对象中定义一对多的依赖,当一个对象改变状态,依赖它的对象会收到通知并更新.

    2.实现   (主要通过jdk自己定义的观察者实现)

    以气象站通知展示板为例子,当气象站收到的各种参数改变的时候,就通知展示板并显示收到的参数.

    定义一个气象站,继承jdk的Observable类

    public class WeatherData extends Observable{
        private float temperature;
        private float humidity;
        private float pressure;
        public WeatherData() {
            
        }
        
        public void measurementChanged() {
            setChanged();
            notifyObservers();
        }
        
        public void setMeasurements(float temperature, float humidity, float pressure) {
            this.temperature = temperature;
            this.humidity = humidity;
            this.pressure = pressure;
            measurementChanged();//改变状态并通知
        }
    
        public float getTemperature() {
            return temperature;
        }
    
        public float getHumidity() {
            return humidity;
        }
    
        public float getPressure() {
            return pressure;
        }
        
        
        
    }

    定义观察者------展示板,并且实现了jdk的Observer接口,代码如下

    public class CurrentConditionsDisplay implements Observer, DisplayElement{
        Observable observable;
        private float temperature;
        private float humidity;
        
        public CurrentConditionsDisplay(Observable observable) {
            this.observable = observable;
            observable.addObserver(this);
        }
    
        @Override
        public void update(Observable o, Object arg) {
            if (o instanceof WeatherData) {
                WeatherData weatherData = (WeatherData)o;
                this.temperature = weatherData.getTemperature();
                this.humidity = weatherData.getHumidity();
                display();
            }
        }
    
        @Override
        public void display() {
            System.out.println(toString());
        }
    
        @Override
        public String toString() {
            return "CurrentConditionsDisplay [temperature=" + temperature + ", humidity=" + humidity + "]";
        }
    
        
    }

    测试类如下

    public class ObserverTest {
        public static void main(String[] args) {
            WeatherData weatherData = new WeatherData();
            CurrentConditionsDisplay display = new CurrentConditionsDisplay(weatherData);
            
            weatherData.setMeasurements(1.2F, 1.2F, 1.3F);
            
        }
    }

    3.总结

    jdk实现观察者模式有个缺点就是Observable是类,不是接口,java只支持单继承,类会限制被观察者的拓展性.

    而且jdk 的setChanged 和 clearChanged 方法都是protected 修饰,不能通过组合来实现这个方法,灵活性较差.

    建议根据具体的需求来决定自己实现还是使用jdk的观察者模式.

  • 相关阅读:
    Bootstrap<基础十四> 按钮下拉菜单
    Bootstrap<基础十三> 按钮组
    Bootstrap <基础十二>下拉菜单(Dropdowns)
    Bootstrap<基础十一>字体图标(Glyphicons)
    Bootstrap<基础十> 响应式实用工具
    Bootstrap<基础九>辅助类
    Bootstrap <基础八>图片
    Bootstrap <基础七>按钮
    Bootstrap<基础六> 表单
    Bootstrap <基础五>表格
  • 原文地址:https://www.cnblogs.com/lishuaiqi/p/11094208.html
Copyright © 2011-2022 走看看