写博客,看博客,要的是直接进入主题,不要太多的前戏,否则读者看着看着就没了兴趣。

所以直接看设计模式-观察者模式的图示介绍:

所谓的主题,即被观者的对象,当这个对象发生变化的时候,对象发出通知,那么订阅了这个主题的订阅者,会接受到通知并进行相关的操作。订阅者可以订阅多个主题,一个主题也可以被多个订阅者订阅。

注意的是,这个地方的所谓的主题、订阅者、通知,是否是和notify相同呢?答案的非也,notify是esb的一种,涉及到消息中心、发送者、订阅者三个方面,而且消息的发送者是不区分数据是否变更的,而是一旦有需要,就直接发送消息,不同的内容的消息,订阅者订阅特定类型的消息进行处理。

这里我们举一个例子,老王开灰机,灰机的前翅子如果参数异常,就让老王跳机。那么看看代码吧:

飞机的前翅子,也就是被观察的对象:

package com.observer; import java.util.Observable; /** * 灰机的前翅子 * <p> * 观察者模式 - 主题对象 * </p> * @author quzishen */ public class ChiZiInfo extends Observable { //~~~ 飞行参数 private double flyParam; //~~~ 旋转速度 private double speed; //~~~ 温度 private float temperature; //~~~ 是否需要检查 private boolean isNeedCheck = true; /** * 通知订阅者参数变更 */ public void paramChanged(){ setChanged(); notifyObservers(isNeedCheck); } public ChiZiInfo(double flyParam, double speed, float temperature) { super(); this.flyParam = flyParam; this.speed = speed; this.temperature = temperature; } /** * 设置参数 * @param flyParm * @param speed * @param temperature */ public void setParam(double flyParm,double speed,float temperature){ this.flyParam = flyParm; this.speed = speed; this.temperature = temperature; // 当参数改变,触发通知 paramChanged(); } public double getFlyParam() { return flyParam; } public void setFlyParam(double flyParam) { this.flyParam = flyParam; } public double getSpeed() { return speed; } public void setSpeed(double speed) { this.speed = speed; } public float getTemperature() { return temperature; } public void setTemperature(float temperature) { this.temperature = temperature; } }

注意其中的参数变化的时候,是手动触发发送通知的!

飞机的平衡机,也就是观察者

package com.observer; import java.util.Observable; import java.util.Observer; /** * 灰机的平衡装置机 * <p> * 观察者模式 - 观察者 * </p> * @author quzishen * */ public class BalanceMechine implements Observer { //~~~ 灰机的前翅子 private ChiZiInfo chiZiInfo; /** * 初始化 */ public void init(ChiZiInfo chiZiInfo){ // 订阅主题 chiZiInfo.addObserver(this); } public void update(Observable o, Object arg) { // 主题类型判断 if(o instanceof ChiZiInfo){ Boolean isNeedCheck = (Boolean)arg; chiZiInfo = (ChiZiInfo)o; if(isNeedCheck){ //~~~ 飞行参数 double flyParam = chiZiInfo.getFlyParam(); //~~~ 旋转速度 double speed = chiZiInfo.getSpeed(); //~~~ 温度 float temperature = chiZiInfo.getTemperature(); if(flyParam > 100 && speed > 10000 && temperature > 250){ publishMsgToDriver("老王,快跳机!"); } } } } /** * 向飞行员发送信号 * @param msg */ private void publishMsgToDriver(String msg){ // publish the message to driver System.out.println(msg); } }

接收到消息之后,先判断是哪种类型,因为可能订阅者订阅了多种主题。

测试代码:

package com.observer; public class Test { /** * 测试灰行员老王跳机 * @param args */ public static void main(String[] args) { ChiZiInfo chiZiInfo = new ChiZiInfo(0,0,0); BalanceMechine balanceMechine = new BalanceMechine(); balanceMechine.init(chiZiInfo); chiZiInfo.setParam(10, 10, 10); chiZiInfo.setParam(100, 10, 10); chiZiInfo.setParam(101, 10001, 300); } }

[HeadFirst]观察者模式 - 老王跳灰机的故事相关推荐

  1. 午夜凶铃,阎王爷召唤程序员老王。。

    故事情节: 一.阎王来电 二.地府显乱象 三.怒搞生死簿系统 四.巧设埋点监听生死时间 五.黑白无常测试显神威 六.规章整治奈何桥 出场人物: 程序员老王,阎王爷,黑白无常,牛头马面,孟婆. 一.阎王 ...

  2. 老王开店和支付路由管理

    老王开店和支付路由管理(王晓憨) 在上大学学金融的第一堂课上,老师说"金融是什么?金融就是放在冰箱里的一块肉,从冰箱拿出来,再放回去,你没做什么,但是手上已经沾满了油."后来阅历再 ...

  3. 不容错过!鸿蒙开发必备神器,老王月薪过万的秘诀都在这了

    大家应该都知道在华为开发者大会HDC.Together 2021主题演讲会上,华为发布了HarmonyOS3.0.0开发者预览版. 预览版本中包含IDE工具DevEco Studio 3.0和DevE ...

  4. 狗蛋(驱动小白)和老王(硬件老司机)关于硬件那点事儿的一次密谈

    引子 "老王,有个bug啊,很紧急啊?" QA急忙反馈到. "什么问题? 老王心里咯噔了下,心想,NND,被QA缠住,看来今晚又得和我的躺椅相依为伴了." &q ...

  5. perl数组硬引用_Perl 继续前行,Perl 7 将是下一代(硬核老王点评版)

    它是默认带有现代行为的 Perl 5,将为以后更大的变化奠定基础. 来源:https://linux.cn/article-12349-1.html 作者:Brian D Foy 译者:Xingyu. ...

  6. 说说计算机发展史在你印象里都有哪些内容,《老王》导学案及答案

    9.<老王>导学案 设计 :  龙的故乡 [学习目标] 1.整体把握文章内容,揣摩"镶嵌.愧怍"等词语的含义. 2.通过具体事例理解老王这个人物形象,学习本文对人物的生 ...

  7. 隔壁老王的iptables防火墙

    防隔壁老王的iptables防火墙 一.Linuux包过滤防火墙概述 1.1防火墙的分类 1.2Linux防火墙 1.3Linux包过滤的工作层次 1.3iptables的表.链结构 1.3.1规则表 ...

  8. 【老王的脑科学谬论】为什么盲人的听觉“似乎”比正常人更“灵敏”?

    欢迎订阅[老王的脑科学谬论]专栏,了解更多基于"老王谬论"对大脑工作原理的分析和猜想. 文章目录 前言:生命科学的困境 一个"模糊"的"记忆现象&qu ...

  9. OSChina 周四乱弹 ——过节上班没关系,老王他休息!

    2019独角兽企业重金招聘Python工程师标准>>> [今日歌曲] 好吧,今天我来推荐歌吧. 听了一个特别好听的歌曲, 必须给你们安利. @树和伊文:推荐歌曲< Insomn ...

最新文章

  1. SAP RETAIL初阶之门店的营业时间
  2. 最早的神经元从何而来?海绵基因图谱揭示神经系统起源
  3. 37.Intellij IDEA解决GBK乱码
  4. 二叉树的建立与遍历(先中后层序)
  5. 优化算法 sklearn lr
  6. 开源:分享10 个让你笑的合不拢嘴的 GitHub 项目!
  7. 织梦首页html在哪儿,dedecms织梦首页去index.html
  8. 计算机视觉论文-2021-06-25
  9. NetScaler SDWAN 的前世今生
  10. 软件工程网络15个人阅读作业1(201521123062 杨钧宇)
  11. plsql dev中Dynamic Performance Tables not accessible分析解决(转载)
  12. Web前端开发初学者十问集锦(4)
  13. 前端架构 IMVC 实时热更新模式
  14. python数组初始化_python怎么初始化数组
  15. 运维人员如何学好shell脚本编程
  16. Android Studio中TextView
  17. 复爱合缘风波后高管调整:命庄海为总裁 王靖为CFO
  18. #九、江恩、四维理论方法从古人那里得到的启发(一)来自星空的启示
  19. 设计——免费PSD素材+设计网站+图标生成工具+自动标注
  20. 【解读】Intel在hot chips上发布首款AI芯片

热门文章

  1. 同济大学博士/硕士学位论文LaTex模板的软件安装与环境配置
  2. IDEA中使用Junit测试
  3. 4行Python代码实时获取股市数据
  4. Java 遍历字符串
  5. Kotlin类成员初始化顺序
  6. Sqlmap功能及其使用(简单够用)
  7. Web应用界面设计规范—给项目组培训
  8. linux中ss命令
  9. H3C 路由器禁止使用traceroute 探测路由
  10. 网络诈骗是大数据的“原罪”吗?