面向对象-Observer

package oo;

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

package oo;

import java.util.ArrayList;
public class WeatherData implements Subject{
private ArrayList observers;
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 notifyObserver()
{
    for (int i=0;i<observers.size();i++)
    {
        Observer observer=(Observer)observers.get(i);
        observer.update(temperature, humidity, pressure);
    }
}

public void measurementsChanged()
{
    notifyObserver();
}

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;
}

}

package oo;

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

}

package oo;

public interface DisplayElement {
   void display();
}

package oo;

public class StatisticsDisplay implements Observer,DisplayElement{
    private float maxTemp=0.0f;
    private float minTemp=200;
    private float tempSum=0.0f;
    private int numReadings;
    private WeatherData weatherData;
    public StatisticsDisplay(WeatherData 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);
    }
}

package oo;

public class CurrentConditionsDisplay implements Observer,DisplayElement{
    private float temperature;
    private float humidity;
    private Subject weatherData;
    
    public CurrentConditionsDisplay(Subject weatherData)
    {
        this.weatherData=weatherData;
        weatherData.registerObserver(this);
    }
    public void update(float temperature,float humidity,float pressure)
    {
        this.temperature=temperature;
        this.humidity=humidity;
        display();
    }
    public void display()
    {
        System.out.println("Current conditions:"+temperature+"F degrees and"+humidity+"%humidity");
    }

}

package oo;

public class HeatIndexDisplay implements Observer,DisplayElement
{
    float heatIndex=0.0f;
    private WeatherData weatherData;
    public void HeateIndexDisplay(WeatherData weatherdata)
    {
        this.weatherData=weatherData;
        weatherData.registerObserver(this);
    }
    public void update(float t,float rh,float pressure)
    {
        heatIndex=computeHeatIndex(t,rh);
        display();
    }
    private float computeHeatIndex(float t,float rh)
    {
        float index = (float)((16.923 + (0.185212 * t) + (5.37941 * rh) - (0.100254 * t * rh)
                + (0.00941695 * (t * t)) + (0.00728898 * (rh * rh))
                + (0.000345372 * (t * t * rh)) - (0.000814971 * (t * rh * rh)) +
                (0.0000102102 * (t * t * rh * rh)) - (0.000038646 * (t * t * t)) + (0.0000291583 *
                (rh * rh * rh)) + (0.00000142721 * (t * t * t * rh)) +
                (0.000000197483 * (t * rh * rh * rh)) - (0.0000000218429 * (t * t * t * rh * rh)) +
                0.000000000843296 * (t * t * rh * rh * rh)) -
                (0.0000000000481975 * (t * t * t * rh * rh * rh)));
        return index;
    }
    public void display()
    {
        System.out.println("Heat index is"+heatIndex);
    }

}

package oo;

public class ForecastDisplay implements Observer,DisplayElement{
private float currentPressure=29.92f;
private float lastPressure;
public ForecastDisplay(WeatherData weatherData)
{
    weatherData.registerObserver(this);
}

public void update(float temp,float humidity,float pressure)
{
    lastPressure=currentPressure;
    currentPressure=pressure;
    display();
}

public void display()
{
    System.out.println("Forecast:");
    if (currentPressure>lastPressure)
    {
        System.out.println("Improving weather on the way!");
        
    }
    else if (currentPressure==lastPressure)
    {
        System.out.println("More of the same");
    }
    else if(currentPressure<lastPressure)
    {
        System.out.println("Watch out for cooler, rainy weather");
    }
}
}

package oo;

public class WeatherStation {
    public static void main(String []args)
{
        WeatherData weatherData=new WeatherData();
        CurrentConditionsDisplay currentDisplay=new CurrentConditionsDisplay(weatherData);
        StatisticsDisplay statisticsDisplay=new StatisticsDisplay(weatherData);
        ForecastDisplay forecastDisplay=new ForecastDisplay(weatherData);    
        weatherData.setMeasurements(80,33,32);
        weatherData.setMeasurements(84,54,34);
        weatherData.setMeasurements(23,23,12);
        
}
}

package oo;

public class WeatherStationHeadIndex {
public static void main(String[]args)
{
    WeatherData weatherData=new WeatherData();
    CurrentConditionsDisplay currentDisplay=new CurrentConditionsDisplay(weatherData);
    StatisticsDisplay statisticsDisplay=new StatisticsDisplay(weatherData);
    ForecastDisplay forecastDisplay=new ForecastDisplay(weatherData);
    HeatIndexDisplay heatIndezDisplay=new HeatIndexDisplay();
    weatherData.setMeasurements(80,34,23);
    weatherData.setMeasurements(34,654,12);
    weatherData.setMeasurements(2,12,543);
}}

时间: 2024-10-29 05:40:21

面向对象-Observer的相关文章

Java程序员应该了解的10个面向对象设计原则

面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator.Observer这样的设计模式,而不重视面向对象的分析和设计.甚至还有经验丰富的Java程序员没有听说过OOPS和SOLID设计原则,他们根本不知道设计原则的好处,也不知道如何依照这些原则来进行编程. 众所周知,Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计.查看Ap

[.net 面向对象程序设计深入](4).NET MVC ——谈谈MVC的版本变迁及新版本6.0发展方向

[.net 面向对象程序设计深入](4).NET MVC ——谈谈MVC的版本变迁及新版本6.0发展方向 1.关于MVC 在本篇中不再详细介绍MVC的基础概念,这些东西百度要比我写的全面多了,MVC从1.0到5.0的时间也不短了,很多人只是按照范例去使用MVC的一些基础功能,并没有更加深入的了解MVC.在这一系列中,我主要介绍MVC的一些原理和使用技巧,以及MVC的发展方向. 先说说MVC,首先他是一种设计模式,如果你百度为什么GOF23种设计模式中没有MVC,答案很有意思,如下: “在他们看来

设计模式--观察者模式【Observer Pattern】

<孙子兵法>有云: "知彼知己,百战不殆:不知彼而知己,一胜一负:不 知彼,不知己,每战必殆" ,那怎么才能知己知彼呢?知己是很容易的,自己的军队嘛,很容易知道,那怎么知彼呢?安插间谍是很好的一个办法,我们今天就来讲一个间谍的故事. 韩非子大家都应该记得吧,法家的代表人物,主张建立法制社会,实施重罚制度,真是非常有远见呀,看看现在社会在呼吁什么,建立法制化的社会,在 2000 多年前就已经提出了.大家可能还不知道,法家还有一个非常重要的代表人物,李斯,对,就是李斯,秦国的丞

Observer(观察者)模式

1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改.也许,你只想根据你的具体应用环境而改进通信代码.或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属. 2.问题 当一个对象的状态发生改变时,你如何通知其他对象?是否需要一个动态方案――一个就像允许脚本的执行一样,允

(转载)Java程序员应当知道的10个面向对象设计原则

面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注意力放在学习面向对象的分析和设计上面.学习面向对象编程像"抽象"."封装"."多态"."继承" 等基础知识是重要的,但同时为了创建简洁.模块化的设计,了解这些设计原则也同等重要.我经常看到不同经验水平的java程序员,他们有的不知

c++ 设计模式5 (Observer / Event 观察者模式)

3.3 观察者模式 (Observer)/发布-订阅模式 动机: 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系"--一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都能得到通知.如果这样的依赖关系过于紧密,将使得软件不能很好地抵御变化. 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合. 代码示例: 文件分割器,添加处理过程进度展示功能. 第一种方法: 分析代码:违背依赖倒置原则 第6行: ProgressB

【行为型】Observer模式

观察者模式意图解决一对多的依赖关系情形中,当被依赖对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新的问题.举个很简单的例子说,假如一个游戏中的角色的某个属性状态发生了变化,此处不妨假设为角色的等级升级了,则相应的在游戏场景中的模型展现([依赖点1])需要跟着调整,并且在UI界面上的角色属性([依赖点2])描述细节中还需要及时更新成新等级值展现给玩家.这边的[依赖点1]与[依赖点2]就依赖于角色的属性,并且对于这两个依赖点来说,属性对它们都是很敏感的,它们需要能够及时感知到这些属性的

First Head 设计模式之观察者模式(Observer Pattern)

前言: 这一节开始学习观察者模式,开始讲之前会先像第一节那样通过一个应用场景来引入该模式.具体场景为:气象站提供了一个WeatherData对象,该对象可以追踪获取天气的温度.气压.湿度信息,WeatherData对象会随即更新三个布告板的显示:目前状况(温度.湿度.气压).气象统计和天气预报. 1.    基本需求:利用WeatherData对象获取数据.并更新三个布告板:目前状况.气象统计和天气预报 WeatherData类图如下: 说明: GetTemperature().GetHumid

c#委托、事件、Observer

委托和事件在.NET Framework[1] 中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易. 中文名 委托 外文名 Delegate 编程语言 C# 作    用 方便的引用被委托的方法 目录 1引言 2参数 3委托 4由来 5编译代码 6设计模式 ? 范例说明 ? 模式简介 7委托事件 1引言编辑 c#委托和事件它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里憋得慌,浑身不自在.本文中,我将通过两个范例由浅