设计模式之观察者模式

2023-10-26

案例展示

原理分析

代码实现

  • Observer 接口
//观察者接口,由观察者来实现
interface Observer {
    fun update(temperatrue: Float?, pressure: Float?, humidity: Float?)
}
  • Observer 接口的实现

class CurrentConditions : Observer {

    var temperatrue: Float? = null
    var pressure: Float? = null
    var humidity: Float? = null

    override fun update(temperatrue: Float?, pressure: Float?, humidity: Float?) {
        this.temperatrue = temperatrue
        this.pressure = pressure
        this.humidity = humidity
        display()
    }

    fun display() {
        println("Temperatrue: $temperatrue , Pressure: $pressure , Humidity: $humidity")
    }
}
  •  Subject 接口

interface Subject {
    fun registerObserver(o: Observer)
    fun removeObserver(o: Observer)
    fun notifyObservers()
}
  •  Subject 接口的实现
class WeatherData : Subject {

    var temperatrue: Float? = null
    var pressure: Float? = null
    var humidity: Float? = null
    val observers: MutableList<Observer> = ArrayList()

    override fun registerObserver(o: Observer) {
        if (!observers.contains(o)) {
            observers.add(o)
        }
    }

    override fun removeObserver(o: Observer) {
        if (observers.contains(o)) {
            observers.remove(o)
        }
    }

    override fun notifyObservers() {
        observers.forEach {
            it.update(temperatrue, pressure, humidity)
        }
    }

    fun setData(temperatrue: Float?, pressure: Float?, humidity: Float?) {
        this.temperatrue = temperatrue
        this.pressure = pressure
        this.humidity = humidity
        notifyObservers()
    }
}
  • 调用代码
fun main() {
    val currentConditions = CurrentConditions()
    val weatherData = WeatherData()
    weatherData.registerObserver(currentConditions)

    weatherData.setData(10F, 20F, 30F)
}
  • 效果展示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之观察者模式 的相关文章

  • Java高频面试复习题,助你面试成功

    前言 2022年对程序员来说是特别严峻的一年 也是大改革的一年 大部分人因为今年 疫情 的原因纷纷离开了自己原有的岗位 也有人抓住机会逆流而上拿到更高的待遇 2022年金九银十已经到来了 试问你进入了自己心仪的企业了吗 拿到自己满意的薪资待
  • 利用Chrome网络请求调试页面跳转问题

    背景 现在大量的信息系统都是基于WEB服务 这些WEB服务糅合了单点登录 权限控制 网关 代理等多种技术手段 当请求一个页面时 发现它跳转的目标竟然让人匪夷所思 完全不是意想中的样子 怎样捕捉这些跳转信息 并进行分析 是解决跳转问题的有效手

随机推荐

  • Android studio 入门第一个APP

    开发第一应用 可以开发属于自己的应用 是否有点小激动 好吧 让我们开始 首先点击Start a new Android Studio Project创建工程 接下来需要输入应用名称 第一个字母要大写 公司域以及指定应用存放目录 点击Next
  • stm32专题十七:深度解析 stm32 硬件iic (i2c)

    首先是配置I2C的GPIO 然后配置I2C参数 就是常规配置 按流程来写不会错 brief EEPROM IIC 配置 void I2C EE config void GPIO InitTypeDef GPIO InitStruct I2C
  • 28所示范性微电子院校占地面积排名,中山大学第一!

    01中山大学13725 中山大学简称中大 现有广州 珠海和深圳三校区五校园 占地面积共计13725亩 1924年 孙中山亲手将广州地区多所高校整合创立国立广东大学 1926年定名为国立中山大学 如今该校由1952年院系调整后分设的中山大学和
  • http://chdbits.org/signup.php 邀请码,www.chdbits.co

    Domain Name chdbits co Registry Domain ID D167587220 CO Registrar WHOIS Server whois godaddy com Registrar URL www godad
  • IAR下如何确定某一段代码的执行时间

    1 接出来一个I O口 然后设置反转 用示波器查看反转周期 2 软件仿真时计算两断点CYCLECOUNTER 在CPU registers中 的差值 乘以指令周期 MCLK 便是执行时间
  • getopt_long 杂谈

    首先先解释一下 getopt long 的 struct 的形式 const struct option longopts help 0 0 h container 1 0 c statistics 1 0 s verbose 0 0 v
  • 关于实现订单超时的几种方案

    更新 2022 10 28 说明 关于使用rabbitmq实现订单超时的部分说明有错误 首先mq是可以实现自定义超时时间的 我们可以在创建队列queue ordercreate时不设置它的x message ttl参数 转而在代码里设置消息
  • 用卷积神经网络实现手写字体的识别

    代码如下所示 coding utf 8 Time 2018 4 4 13 22 Author mgliu FileName mnist py Software PyCharm Community Edition coding utf 8 i
  • 使用R语言进行股票价格预测

    目录 1 准备工作 2 数据准备 3 数据预处理 4 构建和训练模型 5 评估模型
  • win7定位位置服务器,win7 定位 服务器地址

    win7 定位 服务器地址 内容精选 换一换 反向解析主要应用于自建邮箱服务器 可以提高邮箱服务器IP地址和域名的信誉度 多数垃圾邮件发送者使用动态分配或者没有注册域名的IP地址来发送垃圾邮件 以逃避追踪 设置了邮箱服务器IP地址到域名的反
  • eu5,eu7,ex3,ex5安装第三方app

    本教程介绍了 如何简单快速的在北汽的eu5 eu7 ex3 ex5等车安装第三方app应用 比如高德地图 QQ音乐 大大提高车机的娱乐性和可用性 安装过程简单明了 只需要一个U盘就可以了 不需要输入任何命令 按照教程点击按钮就可以完成所有操
  • 车联网安全基础知识学习笔记

    全球车联网产业生态不断丰富完善 当前 全球数字经济快速发展 新一代信息通信技术与各行各业融合渗透 车联网 工业互联网 物联网等新型产业生态不断壮大 有力推动了汽车 交通等传统产业的数字化 网络化 智能化发展 也逐步衍生出智慧出行 交通数字化
  • JeeSite简介

    系统管理 SYS 模块 包括组织架构 用户管理 机构管理 区域管理 菜单管理 角色权限管理 字典管理等功能 内容管理 CMS 模块 包括内容管理 文章 链接 栏目管理 站点管理 公共留言 文件管理 前端网站展示等功能 在线办公 OA 模块
  • 【MRI图像超分辨率入门及研究综述(个人总结版)】

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 了解核磁共振成像 1 机械系统 2 物理学原理 3 数据类型及类型转换 类型 格式转换 1 为什么转换 2 如何进行转换 4 成像过程 k space 定
  • 012-Unity中的几种Find方法

    版本 2018 3 14 1 transform Find 1 可以查找隐藏对象 2 支持路径查找 3 查找隐藏对象的前提是transform所在的根节点必须可见 即active true 注意 只能查找挂载物体上的子物体 否则查不到 2
  • vite require is not defined

    vuex使用webpack中的require context modules true js 获取目录下的所有文件 升级vue3使用vite报 require is not defined import createStore from v
  • element的分页怎么改中文配置_ElementUI pagination分页 自定义配置

    如何使用 ElementUI 自定义分页呢 尽管ElementUI比较全面的提供了分页 但实际开发中的需求是多种多样的 比如我需要把下图中的下拉选择每页的数据条数 换成可以手动输入的形式 并且把他的位置放到前往xx页的左边位置 实现代码如下
  • airpods耳机敲击没反应_为什么华强北AirPods出了那么多仿制品还有很多人不怕被坑,愿意买?...

    原因很简单 原版AirPods功能过于强大 体验感极好 设计非常细节 其次 华强北AirPods价格比原版优惠力度大 原版AirPods外观上 名称 经销商 UPS QI充电器指示 充电外壳采用反磁设计 打开后因为磁极排斥而不会自由下落 耳
  • Google Mock

    View Edit History Content 什么是Mock Google Mock概述 参考文档 最简单的例子 典型的流程 自定义方法 成员函数的期望行为 我改过的例子 现实中的例子 Mock protected private方法
  • 设计模式之观察者模式

    案例展示 原理分析 代码实现 Observer 接口 观察者接口 由观察者来实现 interface Observer fun update temperatrue Float pressure Float humidity Float O