`
cakin24
  • 浏览: 1388294 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

观察者模式——气象局高温预警

阅读更多

一模式定义

观察者模式,又称为发布/订阅模式。观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

 

二模式举例

1 模式分析

我们借用气象局高温预警来说明这一模式。



 

2观察者模式静态类图


 

3代码示例

3.1观察者接口一IObserver

package com.demo.observer;

import com.demo.subject.ISubject;
/**
 * 观察者接口
 * @author 
 *
 */
public interface IObserver
{
	//更新方法
	public void update(ISubject subject);
}

3.2主题接口一ISubject

package com.demo.subject;

import com.demo.observer.IObserver;

/**
 * 主题接口(被观察者)
 * 
 * @author
 * 
 */
public interface ISubject
{
	/**
	 * 增加观察者
	 * 
	 * @param observer
	 * @return
	 */
	public boolean add(IObserver observer);

	/**
	 * 删除观察者
	 * 
	 * @param observer
	 * @return
	 */
	public boolean remove(IObserver observer);

	/**
	 * 通知所有观察者更新数据
	 */
	public void notifyAllObserver();

	/**
	 * 设置温度值
	 * 
	 * @param temperature
	 */
	public void setTemperature(float temperature);

	/**
	 * 获得温度预警
	 * 
	 * @return
	 */
	public String temperatureReport();
}

3.3具体主题实现一Subject

package com.demo.subject;

import java.util.Iterator;
import java.util.Vector;

import com.demo.observer.IObserver;

/**
 * 主题实现类(被观察者)
 * 
 * @author
 * 
 */
public class Subject implements ISubject {
	// 温度
	/**
	 * (一)高温黄色预警信号
	 * 
	 * 标准:连续三天日最高气温将在35℃以上。
	 * 
	 * (二)高温橙色预警信号
	 * 
	 * 标准:24小时内最高气温将升至37℃以上。
	 * 
	 * (三)高温红色预警信号
	 * 
	 * 标准:24小时内最高气温将升至40℃以上。
	 */
	private float temperature;
	// 预警级别
	private String warningLevel;

	// 保存观察者列表
	private final Vector<IObserver> vector;

	/**
	 * 构造方法 初始化观察者列表
	 */
	public Subject() {
		vector = new Vector<IObserver>();
	}

	/**
	 * 增加观察者
	 */
	public boolean add(IObserver observer) {
		if (observer != null && !vector.contains(observer)) {
			return vector.add(observer);
		}

		return false;
	}

	/**
	 * 移除观察者
	 */
	public boolean remove(IObserver observer) {
		return vector.remove(observer);
	}

	/**
	 * 通知所有观察者更新数据
	 */
	public void notifyAllObserver() {
		System.out.println("======气象部门发布高温" + this.warningLevel + "警报!======");
		Iterator<IObserver> iterator = vector.iterator();
		while (iterator.hasNext()) {
			(iterator.next()).update(this);
		}
	}

	/**
	 * 私有方法 根据温度值设置预警级别 然后通知所有观察者
	 */
	private void invoke() {
		if (this.temperature >= 35) {
			if (this.temperature >= 35 && this.temperature < 37) {
				this.warningLevel = "黄色";
			} else if (this.temperature >= 37 && this.temperature < 40) {
				this.warningLevel = "橙色";
			} else if (this.temperature >= 40) {
				this.warningLevel = "红色";
			}
			// 通知所有观察者温度状况
			this.notifyAllObserver();
		}
	}

	/**
	 * 设置温度值
	 * 
	 * @param temperature
	 */
	public void setTemperature(float temperature) {
		this.temperature = temperature;

		this.invoke();
	}

	/**
	 * 获得温度预警
	 */
	public String temperatureReport() {
		return " 温度:" + this.temperature;
	}

}

3.4个人观察者一PersonObserver

package com.demo.observer;

import com.demo.subject.ISubject;
/**
 * 个人用户观察者
 * @author 
 *
 */
public class PersonObserver implements IObserver
{

	public void update(ISubject subject)
	{
		System.out.println("个人收到高温预警:" + subject.temperatureReport());
	}

}

3.5政府观察者一GovernmentObserver

package com.demo.observer;

import com.demo.subject.ISubject;
/**
 * 政府用户观察者
 * @author 
 *
 */
public class GovernmentObserver implements IObserver
{

	public void update(ISubject subject)
	{
		System.out.println("政府部门收到高温预警:" + subject.temperatureReport());
	}

}

3.6企事业单位观察者一CompanyObserver

package com.demo.observer;

import com.demo.subject.ISubject;
/**
 * 企事业单位用户观察者
 * @author 
 *
 */
public class CompanyObserver implements IObserver
{

	public void update(ISubject subject)
	{
		System.out.println("企事业单位收到高温预警:" + subject.temperatureReport());

	}

}

3.7让系统开始运行一Client

package com.demo;

import java.util.Random;

import com.demo.observer.CompanyObserver;
import com.demo.observer.GovernmentObserver;
import com.demo.observer.PersonObserver;
import com.demo.subject.ISubject;
import com.demo.subject.Subject;

/**
 * 客户端应用
 * 
 * @author
 * 
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 创建主题对象
		ISubject subject = new Subject();

		// 增加企事业单位观察者
		subject.add(new CompanyObserver());
		// 增加政府用户观察者
		subject.add(new GovernmentObserver());
		// 增加个人用户观察者
		subject.add(new PersonObserver());

		Random random = new Random();
		int i = 0;
		while (++i < 10) {
			// 设置随机温度
			subject.setTemperature(random.nextInt(45));
		}
	}
}

4运行结果

======气象部门发布高温黄色警报!======

企事业单位收到高温预警: 温度:35.0

政府部门收到高温预警: 温度:35.0

个人收到高温预警: 温度:35.0

======气象部门发布高温红色警报!======

企事业单位收到高温预警: 温度:43.0

政府部门收到高温预警: 温度:43.0

个人收到高温预警: 温度:43.0

======气象部门发布高温橙色警报!======

企事业单位收到高温预警: 温度:37.0

政府部门收到高温预警: 温度:37.0

个人收到高温预警: 温度:37.0

 

三该模式设计原则

1"开——闭"原则

2单一职责原则

3依赖倒置原则

 

四使用场合

1当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,需要将这两个方面分别封装到独立对象中,彼此独立地改变和复用的时候。

2当一个系统中一个对象的改变需要同时改变其他对象内容,但又不知道待改变对象到底有多少个的时候。

3当一个对象的改变必须通知其他对象做出相应的变化,但是不能确定通知对象是谁的时候。

 

五"推数据"静态类图

所谓"推数据",就是当被观察对象发生改变时,将相关数据通过参数形式传递给观察者,这就形成了被观察者"推数据"给观察者,静态类图如下:



 

六"拉数据"静态类图

所谓"拉数据",观察者对象含有一个对被观察者对象实例的引用,当被观察者对象发生变化时,不会传递任何数据给观察者,而由观察者根据被观察者对象实例的引用主动获取相关的数据,这就形成了观察者主动从被观察对象中"拉数据“,静态类图如下:



 

  • 大小: 24.3 KB
  • 大小: 84.8 KB
  • 大小: 61.8 KB
  • 大小: 44.7 KB
1
1
分享到:
评论

相关推荐

    Java使用观察者模式实现气象局高温预警功能示例

    主要介绍了Java使用观察者模式实现气象局高温预警功能,结合完整实例形式分析了java观察者模式实现气象局高温预警的相关接口定义、使用、功能操作技巧,并总结了其设计原则与适用场合,具有一定参考借鉴价值,需要的朋友...

    请根据观察者模式,用Java语言设计并实现气象站程序。

    请根据观察者模式,用Java语言设计并实现气象站程序。其中,部分代码已经写好,包括: • 观察者接口 • 主题接口 • 显示板接口 • 测试程序 请在此框架下,继续完成CurrentConditionsDisplay、ForecastDisplay...

    Java设计模式——观察者模式

    首先,我们来看"Java设计模式——观察者模式的两种情况": 1. **主动通知**: 在这种情况下,被观察者对象在自身状态发生变化时,会主动调用`Observable`接口提供的`notifyObservers()`方法,将变化通知给所有注册的...

    深入浅出设计模式二——WeatherData设计(观察者模式)实现一

    在本文中,我们将深入探讨设计模式中的一个经典案例——观察者模式(Observer Pattern),通过具体的实现来理解其工作原理。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    观察者模式 c++ 实现

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在C++中实现观察者模式,通常涉及以下几个关键概念: 1. **主题(Subject...

    深入浅出设计模式二——WeatherData设计(观察者模式)实现二

    在本文中,我们将深入探讨设计模式中的"观察者模式",并以`WeatherData`为例进行具体实现。观察者模式是一种行为设计模式,它允许我们定义一个订阅机制,当对象状态发生变化时,可以通知所有依赖它的观察者。这种...

    河海大学——气象学实习报告.doc

    河海大学——气象学实习报告.doc

    设计模式系列博客--观察者模式

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...

    观察者模式框架2

    ### 观察者模式框架2 #### 概述 观察者模式是一种常用的设计模式,在软件工程领域被广泛采用。该模式定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。...

    观察者模式

    观察者模式 源代码 样例:李先生希望及时知道气象站所维护的每日天气数据,例如:最高气温和最低气温等,同时还希望及时知道旅行社每日的旅游信息。 采用观察者模式设计,其中李先生就是一个具体的观察者,而气象站...

    Java 观察者模式

    这样,系统的可扩展性大大增强,当需要新增如天气预警等新的显示组件时,只需创建一个新的观察者类并将其注册到气象站即可,而无需改动现有代码。这种松散耦合的设计使得系统更加灵活,符合面向对象设计的原则,也更...

    气象灾害监测预警系统

    气象灾害监测预警系统是针对山丘区突发性强降雨等自然灾害而建立的重要防御体系。系统的主要目的是通过及时的预报和警报,减少人员伤亡和财产损失。设计和建设该系统时,需遵循以下原则: 1. 因地制宜、突出重点:...

    Java常用的3中设计模式代码即工厂模式、单例模式、观察者模式demo

    例如,当我们有一个`WeatherStation`类(被观察者)和多个`WeatherDisplay`类(观察者)时,`WeatherStation`的气象数据变化会自动通知所有`WeatherDisplay`进行更新。 ```java public class WeatherStation ...

    观察者模式代码(JAVA)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的编程模型...

    深入浅出设计模式之观察者模式总结(二)附例子

    **观察者模式**是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这个模式在各种编程语言中都有广泛应用,包括Java、C#...

    观察者模式与JavaBeans事件

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,这种模式被广泛应用于事件处理,例如JavaBeans事件。 JavaBeans...

    Python——气象数据分析.pdf

    "Python 气象数据分析" 本资源是关于使用 Python 进行气象数据分析的详细指南。...2. 气象灾害预警 3. 环境监测 4. 资源管理 通过本资源,你可以学习如何使用 Python 进行气象数据分析,并将其应用于实际问题中。

    抓取预警信息(全国数据10分钟更新一次).zip

    标题中的“抓取预警信息(全国数据10分钟更新一次).zip”表明这是一个与实时气象预警信息抓取相关的项目,其中的数据每10分钟进行一次全国范围的更新。这通常涉及到网络爬虫技术,用于从指定的气象网站或者API接口...

    气象灾害预警信号图标.pdf

    沙尘暴、高温、雷电、大雾和道路结冰这五类气象灾害预警信号则各有三种图标,也是以黄色、橙色和红色来表示。霜冻气象灾害预警信号有三种图标,颜色为蓝色、黄色和橙色。干旱和冰雹两类气象灾害预警信号分别有两种...

Global site tag (gtag.js) - Google Analytics