观察者模式(有时被称为模型(Model)- 视图(View)模式、源-收听者(Listener)模式)或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知,这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统

一、基本介绍

观察者模式是一种对象行为模式。它定于对象间一种一对多的依赖关系,当一个对象的状态发改变时,所有依赖于它的对象都得到通知并被自动更新,在观察者模式中,主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互,权限管理等方面也有广泛应用。
观察者模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化是,所有依赖于它的对象得到通知并自动刷新。

二、代码实现

1、主题-消息发布者:

1)定义主题接口

public interface ISubject {void registerObserver(IObserver obs);void removeObserver(IObserver obs);void publishMessage(Object object);
}

这里以气象数据为主题实现类

public class WeathData implements ISubject {private float humidity;private float temperature;private float pressure;private boolean change;private static List<IObserver> observers;static {observers = new ArrayList<>();}public WeathData() {}public void dataChange() {setChange();//采取观察者抽取消息模式publishMessage();}//模拟数据变化public void changeWeathData(float humidity, float temperature, float pressure) {float tmp = this.temperature;setHumidity(humidity);setTemperature(temperature);setPressure(pressure);//设定条件发送,温度相差0.5时,通知观察者if (Math.abs(tmp - temperature) > 0.5) {dataChange();}}private void setChange() {change = true;}public float getHumidity() {return humidity;}public void setHumidity(float humidity) {this.humidity = humidity;}public float getTemperature() {return temperature;}public void setTemperature(float temperature) {this.temperature = temperature;}public float getPressure() {return pressure;}public void setPressure(float pressure) {this.pressure = pressure;}@Overridepublic void registerObserver(IObserver obs) {if (observers.contains(obs)) {return;}observers.add(obs);}@Overridepublic void removeObserver(IObserver obs) {if (observers.contains(obs)) {observers.remove(obs);}}//推送消息模式@Overridepublic void publishMessage(Object obj) {if (change) {for (IObserver observer : observers) {//将主题对象,和消息内容发送给观察者observer.dealMessage(this,obj);}change = false;}}//抽取消息模式,观察者通过主题对象get方法选择性读取消息public void publishMessage() {publishMessage(null);}
}

2)观察者

定义观察者接口:

public interface IObserver {void dealMessage(ISubject publisher, Object obj);
}

观察者实现类:

public class Observer implements IObserver{private float humidity;private float temperature;private ISubject publisher;public Observer(ISubject publisher) {this.publisher = publisher;publisher.registerObserver(this);}@Overridepublic void dealMessage(ISubject publisher, Object obj) {if (publisher instanceof WeathData) {//主题对象WeathData weathData = (WeathData) publisher;this.humidity = weathData.getHumidity();this.temperature = weathData.getTemperature();display();}}private void display() {System.out.println("humidity = " + humidity + " temperature = " + temperature );}}

3)演示:

public class Demo {public static void main(String[] args) {WeathData weathData = new WeathData();Observer observer = new Observer(weathData);weathData.changeWeathData(1.2f,3.5f,1.4f);weathData.changeWeathData(2.3f,2.2f,4.4f);weathData.changeWeathData(2.3f,2.1f,4.4f);weathData.changeWeathData(2.3f,2.8f,4.4f);}
}

运行结果:

参考资料:

  1. 《Head First设计模式》
  2. 观察者模式–百度百科

认知:设计模式之观察者模式相关推荐

  1. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

  2. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  3. 游戏服务器架构-设计模式之观察者模式和发布订阅模式真的一样吗?

    前面我给大家分享了观察者模式和发布订阅模式,有人私信给我说这俩不是一样嘛,大体没什么区别,我猜测大多数认为这两者是一样的可以继续阅读这两篇文章,如果还不能解答你的问题,我相信这篇文章对比两者的关系会让 ...

  4. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  5. 设计模式 C++观察者模式

    无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个 ...

  6. 学习《图说设计模式》观察者模式

    图说设计模式之观察者模式 1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一 ...

  7. 设计模式之观察者模式——猫抓老鼠2

    设计模式之观察者模式--猫抓老鼠2: 对猫抓老鼠1再次进行优化,降低代码复杂性,以及使用事件来对方法进行保护 代码优化: 将老鼠代码进行优化,将自己的方法在构造时便注册到猫里面: using Syst ...

  8. 设计模式之观察者模式——猫抓老鼠1

    设计模式之观察者模式--猫抓老鼠: 问题描述: 通过猫抓老鼠的例子进行了解观察者模式,首先的初始代码为(有三个类): using System;/// <summary> /// 观察者设 ...

  9. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  10. 「设计模式(二) - 观察者模式」

    「设计模式(二) - 观察者模式」 一.回复TD退订 日常生活中,这种短信无处不在,各种广告,在互联网高速发展的今天,个人信息可以说是透明的.没有任何隐私可言,类似这种通知其实跟我们开发过程使用的观察 ...

最新文章

  1. python常用命令汇总-python数据分析之pandas常用命令整理
  2. mysql sohu_【MySQL中间件之SOHU-DBProxy】
  3. 1063. 计算谱半径(20)
  4. 计算机网络之物理层:2、码元、速率、带宽、波特
  5. 2.12 主成分分析(下)
  6. nasm纠正性训练指南pdf_PDF转word,一键转换?没有这么简单
  7. MySQL中的索引使用
  8. 偶然翻开旧日记本,发现了好多的情诗(三)!!!!
  9. freemarker mysql 生成bean_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.6.6版)...
  10. 毫米波雷达人体姿态估计数据集整理 1 -- Python读取含合并单元格的excel
  11. 有线异步通信原理_全光纤网络结构原理是什么 全光纤网络结构原理介绍【详解】...
  12. iOS 几种打包方式
  13. 监护仪系统都是Linux吗,基于Linux和MCU的心电监护仪设计
  14. Python学习,接上篇文章的50道基础入门练习题(附答案)
  15. 跟随艺术家林曦的脚步 学习“只生欢喜不生愁”的生活态度
  16. 医疗项目 01(项目简介)
  17. Android 动态分区详解(六) 动态分区的底层机制
  18. k8s 中的资源配置
  19. IEEE 期刊双栏模板引用文献问题
  20. 如何作一名成功创业者

热门文章

  1. rssi室内定位算法原理_基于RSSI的室内定位算法
  2. instead of 触发器的用法
  3. tp6 导入excel表格
  4. 苹果测试软件游戏,TestFlight苹果app
  5. 动手学深度学习(tensorflow)---学习笔记整理(五、过拟合和欠拟合相关问题篇)
  6. 行程单批量打印软件(eTerm航空电子客票行程单打印软件)
  7. win10连wifi显示无Internet最全解决方案
  8. 没想到一个起点中文网都可以掀起这么大的波澜
  9. WPS中分节插入页码
  10. 低延迟视频传输 UDP JPEG图像压缩 opencv