本文实例讲述了Java使用观察者模式实现气象局高温预警功能。分享给大家供大家参考,具体如下:
一、模式定义
观察者模式,又称为发布/订阅模式。观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
二、模式举例
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 当一个对象的改变必须通知其他对象做出相应的变化,但是不能确定通知对象是谁的时候。
五、"推数据"静态类图
所谓"推数据",就是当被观察对象发生改变时,将相关数据通过参数形式传递给观察者,这就形成了被观察者"推数据"给观察者,静态类图如下:
六、"拉数据"静态类图
所谓"拉数据",观察者对象含有一个对被观察者对象实例的引用,当被观察者对象发生变化时,不会传递任何数据给观察者,而由观察者根据被观察者对象实例的引用主动获取相关的数据,这就形成了观察者主动从被观察对象中"拉数据“,静态类图如下:
更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
本文向大家介绍c# 实现观察者模式,包括了c# 实现观察者模式的使用技巧和注意事项,需要的朋友参考一下 说明:主要参考《Head First设计模式(中文版)》,使用C#代码实现。 代码:Github 1、观察者模式UML图 2、气象监测类图 3、气象监测代码(书中C#版) 3.1 Observer 3.2 Subject 3.3 测试代码 4、使用C#中IObservable接口实现气象监测 4
本文向大家介绍PHP使用标准库spl实现的观察者模式示例,包括了PHP使用标准库spl实现的观察者模式示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP使用标准库spl实现的观察者模式。分享给大家供大家参考,具体如下: 前面使用纯php实现了一个观察者模式(php观察者模式), 现在使用php标准库spl在次实现观察者模式,好处是:随意的生成您想使用的观察者! 运行结果: Emai
主要内容:介绍,实现,Subject.java,Observer.java,BinaryObserver.java,OctalObserver.java,HexaObserver.java,ObserverPatternDemo.java当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知
观察者模式 亦称: 事件订阅者、监听者、Event-Subscriber、Listener、Observer 意图 观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。 问题 假如你有两种类型的对象: 顾客和 商店 。 顾客对某个特定品牌的产品非常感兴趣 (例如最新型号的 iPhone 手机), 而该产品很快将会在商店里出售。 顾客
一、定义 观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使用事件模型来替代传统的观察者模式。 好处: (1)可广泛应用于异步编程中,是一种替代传递回调函数的方案。 (2)可取代对象之间硬编码的通知机制,一个对象不用再显示地调用另外一个对象的某个接口。两对象轻松解耦。 二、DOM事件–观察者
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用:一个对象(目标对象)