zoukankan      html  css  js  c++  java
  • 观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现

    1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者

    按照上面的分析我们来进行设计

    1.抽象主题Subject

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

    2.抽象观察者Obsever

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

    3.具体主题WeatherData

    public class WeatherData implements Subject {
        private ArrayList observers;
        //temperature、humidity、pressure就是WeatherData的“状态”
        private float temperature;
        private float humidity;
        private float pressure;
        
        public WeatherData() {
            observers = new ArrayList();
        }
        
        public void registerObserver(Observer o) {
            observers.add(o);
        }
        
        public void removeObserver(Observer o) {
            int i = observers.indexOf(o);
            if (i >= 0) {
                observers.remove(i);
            }
        }
        
        public void notifyObservers() {
            for (int i = 0; i < observers.size(); i++) {
                Observer observer = (Observer)observers.get(i);
                observer.update(temperature, humidity, pressure);
            }
        }
        
        public void measurementsChanged() {
            notifyObservers();
        }
        
        public void setMeasurements(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;
        }
    }

    主题:相当的经典,第一具体的主题和多个观察者的集合,当自己的天气发送变化的时候,调用观察者的

    observer.update(temperature, humidity, pressure)通过观察者,观察者就能够通过
    update函数获得最新的天气变化
    具体的主题还必须提供一个接口,让观察者注册进来 registerObserver(Observer o)这个设计模式相当的经典

    5.具体观察者

    public class StatisticsDisplay implements Observer, DisplayElement {
        private float maxTemp = 0.0f;
        private float minTemp = 200;
        private float tempSum= 0.0f;
        private int numReadings;//记录观测的次数以便计算平均温度值
        private Subject weatherData;
    
        public StatisticsDisplay(Subject weatherData) {
            this.weatherData = weatherData;
            weatherData.registerObserver(this);
        }
        //这属于“推”数据,本类只使用到了第一个参数
        public void update(float temp, float humidity, float pressure) {
            tempSum += temp;
            numReadings++;
    
            if (temp > maxTemp) {
                maxTemp = temp;
            }
     
            if (temp < minTemp) {
                minTemp = temp;
            }
    
            display();
        }
    
        public void display() {
            System.out.println("Avg/Max/Min temperature = " + (tempSum / numReadings)
                + "/" + maxTemp + "/" + minTemp);
        }
    }

    具体的观察者在收到最新的主题变化的信息之后,就可以依据最新的信息做自己想要做的事情,例如求气温的平均值等



  • 相关阅读:
    NOTIFYICONDATA结构
    OA系统权限管理设计(转载)
    JQuery打造下拉框联动效果
    MapReduce实现矩阵相乘
    Linux系统下安装phpmyadmin方法
    个人封装的一个Camera类
    从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
    Java实现 蓝桥杯VIP 算法提高 3-1课后习题2
    Java实现 蓝桥杯VIP 算法提高 3-1课后习题2
    Java实现 蓝桥杯VIP 算法提高 3-1课后习题2
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/7738864.html
Copyright © 2011-2022 走看看