
设计模式-观察者模式
数据发布:气象站可以将测量的温度、湿度、气压等数据以公告形式发布到自己的网站或第三方平台。 开放型API设计:让其他第三方可以接入气象站获取数据。 实时通知:当测量数据更新时,需要实时通知注册的第三方。 紧耦合:气象站的业务逻辑直接与接入方绑定,移除一个接入方会导致安全隐患。 难以扩展:如果更多第三方需要接入,需要为每个新接入方增加新的接口,系统复杂度增加。 单向通知:接入方无法通过回调机制主动获取最新数据。 解耦:中心对象和观察者之间松耦合,中心对象只需要通知所有注册的观察者即可。 可扩展性强:新接入方只需实现观察者接口并注册即可,系统架构可随需求扩展。 双向通信:观察者可以主动获取最新数据,适合实时数据同步需求。 中心对象(WeatherData):管理天气数据并通知所有注册的观察者。 观察者(CurrentConditions、BaiduSite等):实现对数据变化的响应逻辑。 观察者接口:定义了观察者需要实现的方法,确保不同类型的观察者可以统一处理数据变化。 高效性:主权对象只需要调用一个方法即可通知所有观察者,避免了逐一调用。 安全性:通过注册和移除机制,确保只有授权的观察者可以接收通知。 可扩展性:新类型的观察者只需实现接口,可以自由组合使用。 扩散式通知:所有关注的对象都会立即接收到通知,无需正向调用。
发布日期:2021-05-26 06:27:20
浏览次数:26
分类:精选文章
本文共 3894 字,大约阅读时间需要 12 分钟。
观察者模式应用设计
项目背景
在一个天气预报项目中,我们需要满足以下特定需求:
传统解决方案的局限
传统的解决方案通常采用直接调用接口的方式,即当数据更新时,直接通知所有接入方。这存在以下问题:
这种设计方式难以在系统扩展或第三方增加时灵活应对,且信息传递方向单向,效率较低。
观察者模式设计
观察者模式原理
观察者模式是一种发布-订阅模式,核心思想是:
- 中心对象(主权对象):发布事件。
- 观察者对象:注册自己的回调方法,接收中心对象发布的事件。
- 通知机制:当事件发生时,主权对象遍历所有注册的观察者,调用它们的回调方法。
这种设计方式具有以下优点:
类图设计
系统主要由以下角色组成:
代码实现详解
接口定义
package com.atguigu.observer.improve;public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers();}
package com.atguigu.observer.improve;public interface Observer { public void update(float temperature, float pressure, float humidity);}
核心实现
package com.atguigu.observer.improve;public class WeatherData implements Subject { private float temperature; private float pressure; private float humidity; private ArrayListobservers; public WeatherData() { observers = new ArrayList<>(); } public void registerObserver(Observer o) { observers.add(o); } public void removeObserver(Observer o) { if (observers.contains(o)) { observers.remove(o); } } public void notifyObservers() { for (int i = 0; i < observers.size(); i++) { Observer observer = observers.get(i); observer.update(temperature, pressure, humidity); } } public void setData(float tmp, float pr, float hu) { temperature = tmp; pressure = pr; humidity = hu; notifyObservers(); }}
观察者类
package com.atguigu.observer.improve;public class CurrentConditions implements Observer { private float temperature; private float pressure; private float humidity; public void update(float tmp, float pr, float hu) { temperature = tmp; pressure = pr; humidity = hu; display(); } public void display() { System.out.println("***Today mTemperature: " + temperature + "***"); System.out.println("***Today m Pressure: " + pressure + "***"); System.out.println("***Today mHumidity: " + humidity + "***"); }}
package com.atguigu.observer.improve;public class BaiduSite implements Observer { private float temperature; private float pressure; private float humidity; public void update(float tmp, float pr, float hu) { temperature = tmp; pressure = pr; humidity = hu; display(); } public void display() { System.out.println("===百度网站===="); System.out.println("***百度网站 气温 : " + temperature + "***"); System.out.println("***百度网站 气压: " + pressure + "***"); System.out.println("***百度网站 湿度: " + humidity + "***"); }}
测试类
package com.atguigu.observer.improve;public class Client { public static void main(String[] args) { WeatherData weatherData = new WeatherData(); CurrentConditions currentConditions = new CurrentConditions(); BaiduSite baiduSite = new BaiduSite(); weatherData.registerObserver(currentConditions); weatherData.registerObserver(baiduSite); weatherData.setData(30f, 100f, 40f); weatherData.removeObserver(currentConditions); System.out.println("移除了当前条件的观察者"); weatherData.setData(40f, 50f, 20f); }}
设计优势
总结
通过对传统模式的分析和观察者模式的应用,我们找到了更为灵活和高效的解决方案。这一设计模式不仅提升了系统的可维护性,也为未来可能的扩展奠定了坚实的基础。在实际应用中,观察者模式表现出色,能够满足复杂的数据同步需求。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月04日 08时06分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【毕设-STM32f103寄存器版本】智能防盗系统
2019-03-16
勒索病毒Kraken2.0.7分析
2019-03-16
MySQL错误1366处理方法
2019-03-16
驱动程序之_1_字符设备_13_USB设备_1_基本概念
2019-03-16
微机原理 6-计算机中常用的数制
2019-03-16
window系统下安装使用curl命令工具
2019-03-16
假如计算机是中国人发明的,那代码应该这么写
2019-03-16
神器 Codelf !
2019-03-16
趣图:会算法和不会算法的区别
2019-03-16
区块链会2020再次爆发,先学点DAPP压压惊,跟我一起学《区块链DApp入门实战》
2019-03-16
问题解决28:微信网页授权出现redicet_uri 参数错误
2019-03-16
LeakCanary 中文使用说明
2019-03-16
反转链表,(5)
2019-03-16
Camera (api1)的打开过程
2019-03-16
wxwidgets绘图
2019-03-16
wxwidgets事件处理
2019-03-16
用OpenCv转换原始图像数据到wximage
2019-03-16
codeblocks下wxWidgets编译与配置
2019-03-16
OpenCv+wxwidgets尝试
2019-03-16