设计模式(2)-观察者模式

从零到一:手把手教你用DJI E-Port套件为M350 RTK开发第三方负载(PSDK V3实战) 本文详细介绍了如何使用DJI E-Port套件为M350 RTK开发第三方负载,涵盖硬件配置、开发环境搭建及实战应用。通过PSDK V3开发套件,开发者可以高效实现负载与无人机的通信,适用于电力巡检等工业场景,提升开发效率与系统稳定性。 阅读详情


更多关于设计模式的文章请点击:设计模式总结


观察者模式是Java标准库的开发中常用的一种设计模式,它完美的将观察者和被观察的对象分离开。当被观察者(主题)改变时,所有观察者(订阅者)都将受到改变的情况,而无论观察者处于什么样的状态。

一、什么是观察者模式

观察者模式(Observer Pattern)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

在这里插入图片描述

二、通过设计气象站模块来说明观察者模式

2.1、观察者模式设计的一般类图

在这里插入图片描述

2.2、观察者模式带来的松耦合

当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。
观察者模式提供了一种对象设计,让主题和观察者之间松耦合。

为什么呢?

关于观察者的一切,主题只知道观察者实现了某个接口(也就是Observer接口)。

主题不需要知道观察者的具体类是谁、做了些什么或其他任何细节。
任何时候我们都可以增加新的观察者。因为主题唯一依赖的东西是一个实现Observer接口的对象列表,所以我们可以随时增加观察者。事实上,在运行时我们可以用新的观察者取代现有的观察者,主题不会受到任何影响。

同样的,也可以在任何时候删除某些观察者。
有新类型的观察者出现时,主题的代码不需要修改。假如我们有个新的具体类需要当观察者,我们不需要为了兼容新类型而修改主题的代码,所有要做的就是在新的类里实现此观察者接口,然后注册为观察者即可。主题不在乎别的,它只会发送通知给所有实现了观察者接口的对象。

我们可以独立地复用主题或观察者。如果我们在其他地方需要使用主题或观察者,可以轻易地复用,因为二者并非紧耦合。

2.3、气象站模块需求

在这里插入图片描述

在这里插入图片描述

2.4、使用观察者模式实现气象站模块

在这里插入图片描述

  • Subject接口
/**
 * @Description: 主题接口
 * @CreateDate: Created in 2018/11/22 11:30
 * @Author: <a href="https://blog.youkuaiyun.com/pbrlovejava">arong</a>
 */
public interface Subject {
    //注册观察者
    public void registerObserver(Observer observer);
    //移除观察者
    public void removeObserver(Observer observer);
    //通知所有观察者
    public void notifyObservers();

}
  • Observer接口
/**
 * @Description:   观察者的接口
 * @CreateDate: Created in 2018/11/22 11:32
 * @Author: <a href="https://blog.youkuaiyun.com/pbrlovejava">arong</a>
 */
public interface Observer {
    //当气象观测值改变时,主题会把这些状态值当作方法的参数,传送给观察者。
    public void update(float temp,float humidity,float pressure);
}
  • DisplayElement类
/**
 * @Description: DisplayElement接口只包含了一个方法,也就是display()。当布告板需要显示时,调用此方法。
 * @CreateDate: Created in 2018/11/22 11:36
 * @Author: <a href="https://blog.youkuaiyun.com/pbrlovejava">arong</a>
 */
public interface DisplayElement {
    public void display();
}
  • WeatherData类
/**
 * @Description:
 * @CreateDate: Created in 2018/11/22 11:38
 * @Author: <a href="https://blog.youkuaiyun.com/pbrlovejava">arong</a>
 */
public class WeatherData implements Subject {
    private ArrayList<Observer> observers;
    private float temp;
    private float hudimity;
    private float pressure;

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


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

    @Override
    public void removeObserver(Observer observer) {
        int i = observers.indexOf(observer);
        if(i >= 0){
            observers.remove(observer);
        }else{
            System.out.println("can not delete--该主题没有被该观察者订阅!");
        }
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temp,hudimity,pressure);
        }
    }

    public void changed(){
        notifyObservers();
    }

    public void setMeasurements(float t,float h,float p){
        this.temp = t;
        this.hudimity = h;
        this.pressure = p;
        changed();
    }
}

  • CurrentConditionDisplay类
/**
 * @Description: 当前天气状况公告板
 * @CreateDate: Created in 2018/11/22 11:48
 * @Author: <a href="https://blog.youkuaiyun.com/pbrlovejava">arong</a>
 */
public class CurrentConditionDisplay implements Observer,DisplayElement{
    private float temp;
    private float humidity;
    private float pressure;
    private Subject subject;

    public CurrentConditionDisplay(Subject s){
        this.subject = s;
        //在该主题中注册该观察者,接受主题发布的变化
        subject.registerObserver(this);
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        this.temp = temp;
        this.humidity = humidity;
        this.pressure = pressure;
        //更新完毕,输出更新后的状态
        display();
    }

    @Override
    public void display() {
        System.out.println("当前天气状况:");
        System.out.println("temp :"+temp+"\t humidity :"+humidity+"\t pressure :"+pressure);
    }
}
  • 测试气象站模块
/**
 * @Description: 测试观察者模式构建的气象站能否使用
 * @CreateDate: Created in 2018/11/22 11:55
 * @Author: <a href="https://blog.youkuaiyun.com/pbrlovejava">arong</a>
 */
public class TestWeatherData {
    @Test
    public void TestObserverPattern(){
        WeatherData weatherData = new WeatherData();
        //三个观察者去订阅weatherData主题,当主题有所改变,观察者会接受到改变
        CurrentConditionDisplay conditionDisplay1 = new CurrentConditionDisplay(weatherData);
        CurrentConditionDisplay conditionDisplay2 = new CurrentConditionDisplay(weatherData);
        CurrentConditionDisplay conditionDisplay3 = new CurrentConditionDisplay(weatherData);
        //主题移除掉一个观察者
        weatherData.removeObserver(conditionDisplay1);
        //更新数据
        weatherData.setMeasurements(1.0f,2.0f,3.0f);
        weatherData.setMeasurements(3.0f,2.0f,1.0f);
    }
}

在这里插入图片描述

分享Charles抓包 显示<unknown> 解决方案 ! 首先电脑上需要安装charles,然后需要设置手机上的WiFi设置,修改配置中的代理设置,把服务器的主机名设置成你电脑当前的ip地址(需要注意的是,你的代理服务器主机名的ip地址要和你当前连的ip地址的网段需要一致)。像 Charles 这样的工具,虽然功能强大,但仍然需要用户具备一定的配置和排障能力,以应对各种复杂的网络环境。通过将 Charles 的 SSL 证书正确安装到移动设备中,并在设置中启用“允许不安全的内容”选项,最终成功解决了这一问题,并准确抓取到所有请求数据。Charles 显示。 阅读详情

相关推荐

《Head First设计模式》第二章笔记 观察者模式

背景 客户有一个WeatherData对象,负责追踪温度、湿度和气压等数据。现在客户给我们提了个需求,让我们利用WeatherData对象取得数据,并更新三个布告板:目前状况、气象统计和天气预报。 WeatherData对象提供了4个接口: getTemperature():获取温度 getHumidity():获取湿度 getPressure():获取气压 measurementsChange...

少说,多做。 3596

从零构建AI智能体:阿里云百炼平台实战指南(一)

本文是阿里云百炼平台构建AI智能体的实战指南。文章详细阐述了从聊天机器人到具备自主规划与执行能力的AI智能体的概念演进,并手把手指导读者在百炼平台上快速创建专属智能体、编排复杂工作流,以及实现多智能体协同,为开发者提供一站式、低门槛的大模型应用开发解决方案。

ol7890123的博客 297

设计模式入门-观察者模式(二)

今天有空,来解决一下所写的上一篇《观察者模式》中残留的问题。前续的文章地址是 《观察者模式》       在上一篇文章中,自己定义观察者模式中的主题接口,观察者接口,然后通过实现该主题接口得到了WeatherData类,通过实现观察者接口得到三个观察者(布告板):当前天气CurrentConditionDisplay,天气统计StatisticsDiaplay,预告天气ForecastDispl

u010852801的专栏 487

Python 逆向解析知乎盐选反爬字体,实现内容精准还原

本文详细解析了知乎盐选内容的反爬字体机制,并提供了使用Python逆向解析WOFF字体文件的完整方案。通过fontTools库构建解码字典,实现乱码文本的精准还原,帮助开发者应对动态字体策略,同时强调法律与道德风险。

weixin_29268385的博客 1298

EBSD数据转ABAQUS的inp文件实操指南

晶体塑性有限元模拟中,如何将材料微观组织表征数据转化为可计算的有限元模型,是连接实验与仿真的关键环节。EBSD技术能够获取材料表面的晶体取向、晶粒形貌和晶界分布信息,但这类数据需要经过格式解析、欧拉角转换、网格生成等步骤,才能被ABAQUS等有限元软件读取。通过将扫描点坐标映射为节点、按像素邻域生成单元,并将Bunge约定欧拉角变换为局部坐标系方向余弦,用户可以准确构建包含真实微观结构的inp文件模型。这一流程广泛应用于金属材料形变、织构演化及应力集中分析等研究场景,有效提升仿真结果与实验的一致性。围绕数据

weixin_42509513的博客 314

设计模式--观察者模式

1、角色说明 观察者模式中,主要有两类角色:主题(subject)和观察者(observer)。 主题:采集数据,将更新消息推送给订阅该主题的所有观察者; 观察者: 订阅了主题之后,可以从主题中接收通知; 此模式结构类图如下: 2、实例问题 java中内置有观察者模式,但是为了更好地理解此模式,我们以《Head First 设计模式》一书中的例子为切入点,自己搭建一套关于天气的观察者模式...

yzy199391的博客 466

从原理到实践:MIPI D-PHY v1.2的HS-Deskew功能全解析(附时序图详解)

本文深入解析MIPI D-PHY v1.2的HS-Deskew功能,从技术背景到实现机制,详细介绍了其在2.5Gbps高速传输中的关键作用。通过时序图详解和实测数据,帮助工程师理解并应用这一技术,解决信号完整性问题,提升系统可靠性。

weixin_30300225的博客 308

设计模式详解之————观察者模式(一)

定义 观察者模式定义了对象之间一对多的依赖,当一个对象改变状态,其他依赖者都会受到通知。 出版者+订阅者=观察者模式(《HEAD FIRST 设计模式》)。 注:发布订阅模式有异于观察者模式,是因为发布订阅会有一个消息中间件参与,具体不再赘述。更多的认为发布订阅模式是观察者模式的演变。 代码实现 设计原则 将程序中的变化的方面和固定不变的方面分离 在观察者模式中,会改变的是主题的状态,以及观察...

朝夕 795

告别理论!手把手教你用Vivado 2020.2为ZYNQ PL端打造一个AXI4-Full读写DDR的IP核

本文详细介绍了如何使用Vivado 2020.2为ZYNQ PL端创建AXI4-Full主控IP核,实现高效读写DDR内存的实战指南。通过环境配置、IP核创建、系统集成到软件调试的全流程讲解,帮助开发者快速掌握AXI4-Full协议在ZYNQ平台上的应用,提升PL与PS协同工作的数据传输效率。

weixin_30300225的博客 467

在armv8架构中,有哪些是serror

(3)、RAS(Reliability, Availability, and Serviceability)错误:一些对于系统的可靠性、可用性和可维护性有影响的错误可能会触发 SError。(2)、ECC(Error Correction Code)错误:在访问带有错误校验的内存(如ECC内存)时,如果发现错误校验失败,可能会产生SError。2、其实呢,大多数Serror都是实现定义的,真正实现的serror就没有多少个。Serror(也称System Error),是异步异常的一种,一般是来自。

baron-周贺贺-代码改变世界ctw 1013

观察者模式(Observer Pattern)

一、什么是观察者模式 观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象(目标对象)的状态发生改变时,所有依赖于它的对象(观察对象)都得到通知并被自动更新。特点:被观察者和观察者一般是一对多的关系,一个被观察者对应多个观察者,当一个被观察者的状态发生改变时,被观察者通知观察者,然后可以在观察者内部进行业务逻辑的处理。 JDK 提供了 一套观察者模式的实现,在java.util包中, java.util.Observable类和java.util.Observer接口。Observa

ChineseSoftware的博客 3805

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

HeadFirst设计模式(2)-观察者模式(ObserverPattern)

第二节观察者模式(OberverPattern) HeadFirst这节给出的案例是气象站监测应用系统。背景是:气象站通过物流装置获取气象信息,生成WeatherData(气象数据),最后通过布告板显示给用户。WeatherData可以获取物理装置的数据,并且将数据显示到布告板上:目前状况(温度、湿度、气压)、气象统计和天气预报。 先给出一个错误示范 public class...

weixin_30481087的博客 97

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【设计模式总结】2、观察者模式

观察者模式是个非常常见的设计模式,窗体程序中、MVC等都大量使用了观察者模式。 观察者模式,可以理解为采用订阅、推送消息的方式实现一对多(其实还可以‘拉’消息,Java内置库中有相应实现,但‘推’更为巧妙,本文实现用的‘推’)。 概念 在对象之间定义一对多依赖,这样一来,当一个对象改变状态,依赖他的对象会收到通知,并自动更新。 主题与观察者 *《HeadFirst 设计模式》*一书中提到了订阅报纸...

Alexander的博客 285

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

设计模式-2、观察者模式

设计模式-2、观察者模式一、观察者模式代码二、代理模式基础铺垫正式项目 一、观察者模式 1、不断的询问 游戏开发场景:     1、播放一个大招,在0.5秒时播放一个音效 代码 using System.Collections; using System.Collections.Generic; using UnityEngine; public class ObserverBase : MonoBehaviour { //此部分为伪代码 Anima

爱吃芒果的薯条 的博客 194

设计模式2——观察者模式

1 模式说明 观察者模式就像报纸出版商和订阅者一样,在观察者模式中出版者叫做“主题”(subject),订阅者叫做“观察者”(observer)。主题内的数据产生变化时,就会通知已经订阅该主题的观察者,观察者如果订阅了主题,一旦主题发生变化发来通知,观察者就会做出相应的调整。观察者的数量可以是很多,换句话说就是很多人可以同时订阅一个主题。主题和观察者是1对多的关系。 说明 (1)如图1,一共有5个...

可耳(keer)的博客 213

设计模式2-》观察者模式

观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 介绍 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。 如何解决:使用

TonyWu的博客 524

设计模式(2)——观察者模式

观察者(Observer)模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 观察者模式的原理有点类似报纸和杂志的订阅。 报社的业务就是出版报纸 向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订户,你就会一直收到新报纸。 当你不想再看报纸的时候,取消订阅,他们就不会再送新报纸来。 只要报社还在运营,就会一直有人(...

liinux-Talk is cheap,show me the code. 170

《HF 设计模式》 C2 观察者模式

文章目录1 模拟气象站布告1.1 一个错误示范1.2 报社和订阅者1.3 定义观察者模式1.4 松耦合1.5 实现气象站布告系统1.6 观察者获取数据的方式1.7 Java内置的观察者模式1.8 设立changed标志1.9 1 模拟气象站布告 在一个模拟气象站布告的应用中,我们将建立3个布告板,分别为:目前天气,气象统计和天气预报,气象站提供了一个WeatherData对象,它能够及时获取温度,湿度,气压等信息,我们根据WeatherData获取到的数据来更新这几个布告板 但是布告板的更新是由用户

weixin_43541094的博客 491

设计模式2-观察者模式

观察者模式,模拟气象站与布告栏

weixin_44200074的博客 193

设计模式:观察者模式(2)

推模式 被观察对象向观察者推送主题的详情信息时候,不管观察者是否需要,这些信息一般是观察目标对象的全部或者部分信息。一般这种模型实现通过update(objectobj)将观察目标对象传入进去。 拉模式 被观察对象通知观察者时候,只发送少量的信息,如果需要详情信息时候,被观察对象也就是观察目标对象主动到观察者当中,然后通过观察目标对象老获取信息。通常使用update(suObject s...

来杯Java 3021

设计模式-2 观察者模式

观察者模式

小飞将的博客 189

设计模式-观察者模式2

观察者2

ADCQprogrammer的博客 445

观察者模式--设计模式2

observer模式 它的作用是当一个对象的状态发生变化时,能够自动通知其他的关联的对象。 自动刷新对象状态。 观察者模式角色和职责 Subject 被观察者 被观察的对象,当需要被观察的状态发生变化时,需要通知队列中所有的观察者对象。 subject需要维护(添加,删除,通知)一个观察者对象的列表。 Concreate subject 被观察者的具体实现。 Observer 观察者 接口或者抽象...

u010160949的博客 109

设计模式笔记_10_观察者模式2

package com.maom.design.D_10_Observer; import java.util.Observable; import java.util.Observer; /** * @Title: D_10_Observer * @Description: 10_观察者模式 * @Author maohb * @Version 1.0 */ public cla...

七点十七 137

《HeadFirst设计模式》(2)——观察者模式

模式定义 观察者模式(Observer) 定义了对象间的一对多依赖,当一个对象(Subject)状态改变时,所有的依赖者(Observer)都会收到通知并自动更新。 设计原则 松耦合设计。 双方不知道彼此具体是什么,只知道对方是一类的对象就行。 问题场景 有一个气象站,存有采集到的气象数据。目前的工作为建立一个应用,利用气象站的数据更新三个布告板:目前状况、气象统计、天气预报。要求当气象数据更新...

一生悬命的博客 271
上一篇: 设计模式(1)-策略模式
下一篇: 设计模式(3)-装饰者模式
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值