java观察者模式例子

news2024/11/28 14:19:35

观察者模式:

是一种常用的设计模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,它的所有观察者都会收到通知并且自动更新。

在观察者模式中,主题对象通常被称为“被观察者”(Observable)或 “主体” (Subject),而观察者对象通常被称为“观察者”(Observer)或 “订阅者”(Subscriber)。主题对象维护一个观察者列表,当它的状态发生变化时,会遍历这个列表并通知所有的观察者。

观察者模式的优点:

  • 解耦性:

观察者模式将主题对象和观察者对象解耦,它们之间只依赖于抽象接口,而不是具体的实现。

  • 可扩展性:

可以通过添加新的观察者对象来扩展系统,而不需要修改主题的代码。

  • 灵活性

观察者模式可以在运行时动态地添加或删除观察者对象,使得系统更加灵活。

观察者模式java示例

在现实生活中,我们经常会从手机、电脑、电视等途径关注天气。假设有一个气象站,它会定期更新当前的天气情况,并且希望通知所有的观察者(比如手机端、电视端、网站端等)。

首先我们定义一个主题接口Subject,它包含添加、删除和通知观察者的方法:

package com.obser;

/**
 * @author evanYang
 * @since 2023/6/6 2:34 PM
 */
public interface Subject {
    void registerObserver(Observer observer);
    void removeOberver(Observer observer);
    void notifyObserver();
}

接下来,我们定义一个具体的主题类 WeatherData,它实现了 Subject 接口,并且包含了当前天气情况的数据:

package com.obser;

import java.util.ArrayList;
import java.util.List;

/**
 * @author evanYang
 * @since 2023/6/6 2:41 PM
 */
public class WeatherData implements Subject{
    private float temperature;
    private float humidity;
    private float pressure;

    private List<Observer> observers;

    public WeatherData() {
        this.observers = new ArrayList<>();
    }

    public void setMeasurements(float temperature,float humidity,float pressure) {
        this.temperature=temperature;
        this.pressure=pressure;
        this.humidity=humidity;
        notifyObserver();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeOberver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObserver() {
        for (Observer observer : observers) {
            observer.update(temperature,humidity,pressure);
        }
    }
}

其中,WeatherData 类维护了一个观察者列表 observers,并且在数据发生变化时调用 notifyObservers() 方法通知所有观察者。

接下来,我们定义一个观察者接口 Observer,它包含了一个更新方法 update():

package com.obser;

/**
 * @author evanYang
 * @since 2023/6/6 2:35 PM
 */
public interface Observer {

    void update(float temperature,float humidity,float pressure);
}

最后,我们定义一个具体的观察者类 PhoneDisplay,它实现了 Observer 接口,并且在接收到通知后更新显示:

package com.obser;

/**
 * @author evanYang
 * @since 2023/6/6 2:48 PM
 */
public class PhoneDisplay implements Observer{
    private float temperature;
    private float humidity;
    private float pressure;
    @Override
    public void update(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        display();
    }

    public void display() {
        System.out.println("currency conditions: "+ temperature + "F degress and " + humidity + "%humidity and "
            + pressure + "Pa pressure"  );
    }
}

现在,我们可以创建一个 WeatherData 对象,并且添加一个 PhoneDisplay 观察者,然后模拟天气数据的变化:

package com.obser;

/**
 * @author evanYang
 * @since 2023/6/6 2:52 PM
 */
public class MainDemo {

    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        PhoneDisplay display = new PhoneDisplay();
        weatherData.registerObserver(display);

        weatherData.setMeasurements(80,20,33);
        weatherData.setMeasurements(50,22,11);
        weatherData.setMeasurements(66,22,11);
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Minicap编译及简单使用

什么是MiniCap 官方说法&#xff1a;Minicap提供了一个套接字接口&#xff0c;用于从Android设备流式传输实时屏幕捕获数据。它旨在用作更大程序中的组件&#xff0c;因此仅凭其本身并不是非常有用。例如&#xff0c;它在STF中用于远程控制。 个人理解&#xff1a;Minicap是用…

如何检查 Android 设备是否支持 Widevine DRM

想知道您的 Android 设备是否可以流式传输来自 Netflix 和 Amazon Prime Video 的高清视频&#xff1f;这是检查 Widevine DRM 支持的方法&#xff01; 许多流媒体服务&#xff0c;如 Netflix、Disney、Hulu 等&#xff0c;使用各种类型的数字版权管理 (DRM) 来保护其内容不被…

VulnHub项目:Hogwarts dobby

靶机地址&#xff1a;Hogwarts: Dobby ~ VulnHub 哈利波特也是初中时候最喜欢的电影~Dobby多比是马尔福加的奴隶精灵&#xff0c;出现在第二部密室中&#xff0c;后来被哈利波特的袜子所拯救&#xff0c;成为了一只快乐自由的小精灵&#xff0c;最后它在死亡圣器中&#xff0c…

keil从非0x08000000地址调试STM32单片机程序方法

在使用stm32单片机的串口IAP升级功能时&#xff0c;需要调试bootloader程序和app程序&#xff0c;一般bootloader的程序都是从0x08000000地址开始运行的&#xff0c;使用keil软件可以直接进行仿真&#xff0c;但是如果调试app程序的话&#xff0c;由于它不是从0x08000000地址开…

Java程序判断是否是回文

1 问题 利用java程序判断是否是回文。 2 方法 利用函数库&#xff0c;将输入的字符串倒置&#xff0c;看倒置后的字符串和原来的字符串是否一样&#xff0c;然后得出结论。 package practice; import java.util.Scanner; public class Huiwen { public static void main(St…

【MySQL数据库 | 第五篇】DDl操作数据库

目录 &#x1f914;DDL介绍&#xff1a; &#x1f914;语法详解&#xff1a; 1.查询&#xff1a; 1.查询所有数据库&#xff1a; 示例&#xff1a;查询自带数据库 2.查询当前数据库&#xff1a; 2.创建&#xff1a; 示例&#xff1a;创建一个名字叫做itcast的数据库&…

第一期丨INTERSPEECH 2023 论文预讲会

INTERSPEECH 2023 论文预讲会是由CCF语音对话与听觉专委会、语音之家主办&#xff0c;旨在为学者们提供更多的交流机会&#xff0c;更方便、快捷地了解领域前沿。活动将邀请 INTERSPEECH 2023 录用论文的作者进行报告交流。 INTERSPEECH 2023 论文预讲会第一期邀请到清华大学和…

【新版】系统架构设计师 - 系统工程与信息系统基础

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 系统工程与信息系统基础考点摘要系统工程概念系统工程方法生命周期阶段及方法 信息系统诺兰模型信息系统的生命周期信息系统的建设原则信息系统的开发方法信息系统的分类信息化系统业务处理系统【…

【高危】Apache Cassandra 存在越权漏洞导致远程命令执行

漏洞描述 Apache Cassandra 是 Apache 基金会的一个分布式 Nosql 数据库。 Apache Cassandra 的受影响版本中&#xff0c;由于没有对JMX/nodetool权限的用户做限制&#xff0c;当启动FQL/Audit日志时&#xff0c;拥有 JMX/nodetool 权限的攻击者可以以 cassandra 的身份权限执…

QMediaPlayer 打包解码器注意事项

程序打包注意事项 如果需要把我们的程序进行打包&#xff0c;给客户安装使用&#xff0c;那么还需要引导客户额外安装LAVFilters&#xff0c;显得比较麻烦。接下来&#xff0c;介绍&#xff0c;如何将解码器打包进安装包。 1、QMediaPlayer找到解码器的原理 先来看看解码器&am…

Android 各版本特性

一&#xff1a;介绍 我们可以看到Android版本对应的Api版本 二&#xff1a;Android 6.0 &#xff08;API 23&#xff09; Google I/O 2015大会如约已于2015年5月28日举行。在发布会上代号为“Marshmallow&#xff08;棉花糖&#xff09;”的安卓6.0系统正式推出。 Android …

LVS简介及LVS-NAT负载均衡群集的搭建(要像记得回家的路一样记得理想和远方)

文章目录 一、LVS群集的简介1.群集的含义和应用场景2.性能扩展方式群集的分类负载均衡&#xff08;LB&#xff09;高可用&#xff08;HA&#xff09;高性能运算&#xff08;HPC&#xff09; 二、LVS负载均衡群集简介及搭建1.负载均衡群集架构第一层&#xff0c;负载调度器&…

Linux - sudo:/etc/sudoers 可被任何人写

错误如下&#xff1a; sudo: /etc/sudoers 可被任何人写 sudo: 没有找到有效的 sudoers 资源&#xff0c;退出 sudo: 无法初始化策略插件 需求就是除了root账号&#xff0c;别的账号也能执行mkdir等命令 1. 先用root把 chmod 777 /etc/sudoers 设置可修改 2. 添加一条 xxx…

JIRA维护记——使用原实例位置恢复数据

一、出现问题 昨天下班了&#xff0c;同事反馈Jira又不能使用了。想都不用想&#xff0c;肯定是磁盘空间不足了&#xff0c;因为已经出现过几次了。之前都是清理一下磁盘空间即可&#xff0c;都不用重启Jira。 今天一上班就开始清理磁盘空间&#xff0c;把一些日志啊&#xf…

数据在内存中的存储(打入“内部”深度剖析哦)

前面的文章介绍中&#xff0c;只对整数在内存中的存储进行了简单介绍&#xff0c;可是只了解这么一点点是远远不够的呢&#xff0c;这篇文章呢就对数据在内存中的存储的几个重难点进行了详细的介绍哦&#xff0c;希望对爱学习的小伙伴们有所帮助&#xff5e; 目录 一.数据类型…

【Protobuf速成指南】Message中如何定义“数组”?

文章目录 2.0一、字段规则1.1 规则1.2 改进1.3 消息类型作为字段类型 二、repeated字段使用方式三、Contact2.01.write.cc2.read.cc3. 查看二进制信息①hexdump② --decode选项 2.0 本系列文章将通过对通讯录项目的不断完善&#xff0c;带大家由浅入深的学习Protobuf的使用。这…

win10的另一种美化字体的方式,使用noMeiryoUI

目录 1. 前提2. 字体选择3. 查看已经安装的字体并查看效果4. 安装软件修改系统字体5. 修改浏览器字体 1. 前提 21年的时候写了一篇文章&#xff0c;《Windows10下美化字体&#xff0c;达到类似mac的效果》&#xff0c;当时还很迷恋macType这个软件的使用&#xff0c;觉得好牛逼…

Linux——安装VMwaretools实现文件共享功能

作为一个Linux初学者&#xff0c;应该熟悉相关的文件下载和安装以及简单的配置命令&#xff0c;下面通过安装一个VMwaretools来实现window环境和Linux环境下文件的共享功能的实现。 一、安装VMwaretools 点击重新安装后&#xff0c;会在桌面上看到有一个光盘&#xff0c;则代表…

单片机的基础知识和原理

单片机是一种集成了中央处理器&#xff08;CPU&#xff09;、内存、输入/输出&#xff08;I/O&#xff09;端口和其他外设的小型计算机系统。它通常用于嵌入式系统&#xff0c;如家电、汽车电子、工业控制等领域。 下面是单片机的基础知识和原理的概述&#xff1a; 架构&…

Linux系统安装——VMware15.5安装centos7.6 (附资料下载+联网配置+踩坑总结)

一、安装虚拟机VMware15.5 VMware虚拟机安装Win10&#xff0c;安装包秘钥/系统镜像/激活工具如下&#xff1a;(主要这个地址不限速&#xff0c;方便&#xff01;) https://www.123pan.com/s/g520Vv-Dg2id (遇到会拦截下载任务的浏览器&#xff0c;直接换浏览器下载即可&#xf…