观察者模式(Observer)

UML用例图解说,初学者了解用例 用例图解说用例图解说用例图解说,UML用例图解说,初学者了解用例 立即下载

前言:
观察者(Observer)模式是对象的行为模式,又叫做发布-订阅模式、模型-视图模式、源-监听器模式或从属者模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化是,会让通知所有观察者对象,是他们能够自动更新自己。
(一)观察者模式的简略图:
这里写图片描述
(二)观察者模式的环境角色
抽象主题(Subject)角色:主题角色把所有对观察者对象的引用保存在一个聚集(比如Vector对象)里,每个主题都可以有任何数量的观察者。
抽象观察者者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知是更新自己。
具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。
具体观察者(ConcreteObserver)角色:存储与主题的状态自已的状态。
(三)示例源码:
抽象主题(Subject)角色:

package com.observer;

public interface Subject
{
    /**
     * 调用这个方法登记一个新的观察者对象
     * @param observer
     */
    public void attach(Observer observer);
    /**
     * 调用这个方法删除一个已经登记过的观察者对象
     * @param observer33
     */

    public void detach(Observer observer);
    /**
     * 调用这个方法通知所有登记过的观察者对象
     */

    void notifyObserver();
}

抽象观察者者(Observer)角色:

package com.observer;

public interface Observer
{
    /**
     * 调用这个会更新自己
     */
    void update()
}

具体主题(ConcreteSubject)角色:

package com.observer;

import java.util.Enumeration;
import java.util.Vector;

public class ConcreteSubject implements Subject
{
    private Vector observersVector=new Vector();
    /**
     * 调用这个方法登记一个新的观察者对象
     */
    public void attach(Observer observer)
    {
        observersVector.addElement(observer);
    }
    /**
     * 调用这个方法删除一个已经登记过的观察者对象
     */
    public void detach(Observer observer)
    {
        observersVector.removeElement(observer);
    }
    /**
     * 通知这个方法通知所有登记过的观察者对象
     * @return 
     */
    public void  notifyObserver()
    {
        Enumeration enumeration=observers();
        while(enumeration.hasMoreElements())
        {
            ((Observer)enumeration.nextElement()).update();

        }

    }
    public Enumeration observers()
    {
        return((Vector)observersVector.clone()).elements();
    }
}

具体观察者(ConcreteObserver)角色:

package com.observer;

public class ConcreteObserver implements Observer
{
    /**
     * 调用这个方法会更新自己
     */
    public void update()
    {
        System.out.println("I am notified");
    }
}

(四)JDK中的Observer
Observer接口
示例图
源码
抽象观察者者(Observer)角色:


package java.util;
public interface Observer
{
    /**
    *调用这个方法会更新自己
    */
    void update(Observable o, Object arg);
}

java.util.Observable类
抽象主题类(被观察者)


package java.util;
public class Observable {
    private boolean changed = false;
    private Vector obs;

    /** Construct an Observable with zero Observers. */

    public Observable() {
        obs = new Vector();
    }
    /**
    *将一个观察者加到观察者聚集上面
    */
    public synchronized void addObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
        if (!obs.contains(o)) {
            obs.addElement(o);
        }
    }

    /**
    *将一个观察者对象从观察者聚集上删除
     */
    public synchronized void deleteObserver(Observer o) {
        obs.removeElement(o);
    }

    /**
     * 相当于notifyObserver(null)
     */
    public void notifyObservers() {
        notifyObservers(null);
    }

    /**
     *如果被对象有变化(那时hasChannged方法会返回true)
     *调用本方法通知所有登记在案的观察者,调用它们的update()方法
     *传入this和arg作为参量
     */
    public void notifyObservers(Object arg) {
        /*
         * 临时存放当前的观察者的状态,参见备忘录模式
         */
        Object[] arrLocal;
        synchronized (this) {
            if (!changed)
                return;
            arrLocal = obs.toArray();
            clearChanged();
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);
    }
    public synchronized void deleteObservers() {
        obs.removeAllElements();
    }
    protected synchronized void setChanged() {
        changed = true;
    }
    protected synchronized void clearChanged() {
        changed = false;
    }
    public synchronized boolean hasChanged() {
        return changed;
    }
    public synchronized int countObservers() {
        return obs.size();
    }
}

每个观察者都是实现Observer接口的对象。在被观察者对象发生变化时,他会调用Observable的notifyObservers方法,此方法调用所有的具体观察者的update()方法,从而是所有的观察者都被通知更新自己。
调用例图如下:
这里写图片描述
(五)观察者模式的应用场景
1、对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
(六)观察者模式是的优缺点
优点
1)观察 者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体现察者聚集,每一个具体现察者都符合一个抽象观察者的接口。被观察者 并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。
(2)观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。
观察者模式有下面的一些缺点:
(1) 如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
(2)如果在被观察者之间有循环依赖的话, 被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察考模式时要特别注意这一点。
(3)如果对观察者的通知是通过另外的线程进 行异步投递的话,系统必须保证投递是以自恰的方式进行的。
(4)虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者 模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。
参考资料《java与模式》
《head first 设计模式》

逆向分析顶象5代各类验证码类型的图片还原方法(附源码) 6.刷新滑块验证码图片,会进入之前的for循环断点,分析此处的代码会发现,该循环循环了处理了n字符串的值,取出n字符中的值并使用charCodeAt生成Unicode 编码,然后又调用了a函数,如果a函数返回true就会把之前生成的Unicode编码+1,a函数参数分别是c数组和Unicode取余32后的值,然后再把Unicode取余32后的值push进c数组,这里的n值为滑块碎片背景图的name。2.搜索"ranges":,会找到ranges赋值的地方,在此处代码断点,并点击跳过断点,结束此次调试。 阅读详情

相关推荐

Python爬取网页数据并写入Excel

ChromeDriver下载链接:https://registry.npmmirror.com/binary.html?path=chromedriver/本例是从Excel表从读取数据,运用到网页中进行搜索,再将结果写入Excel表中。这里要先下载与Chrome版本相同的chromedriver(版本要相同!下载好后,将chromedriver路径正确配置在环境变量中。刚才爬了一些数据,分享一下代码。

weixin_68443051的博客 2519

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

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式包含以下角色:主题(Subject):被观察的对象,维护一个观察者列表,提供添加、删除和通知观察者的方法。观察者(Observer):观察主题对象的状态变化,实现 Update 方法来更新自己的状态。

miaoyl的博客 7671

光电系统光轴校准与偏差控制实战指南

光轴作为光电系统的空间基准坐标系,直接影响多光谱传感器的协同工作精度。在包含可见光、红外与激光测距的复合系统中,光轴偏差会导致目标识别误差与打击精度下降。通过机械基准建立、光学通道粗调和多光谱协同校准等工厂级标定流程,结合千米靶标法、星点校准法等野战应急方案,可有效控制光轴偏差。典型应用场景中,温度补偿与振动抑制技术能维持光轴稳定性,如某舰载系统通过500Hz高频视觉伺服实现0.3mrad振动补偿。掌握这些光轴标定与保持策略,对提升光电系统在侦察、测距等场景的实战性能具有关键价值。

weixin_36149538的博客 274

设计模式 - 观察者Observer模式

观察者模式又叫做观察者(Observer)监听者(Listener)模式,也叫发布(Publish)订阅(Subscribe)模式,常用于解耦事件的观察和事件最终的处理方式,举个例子说明:例子:基于同一组数据,生成了很多不同的界面来显示,有曲线图显示方式,有圆饼图显示方式,有柱状图显示方式等等…,当底层数据发生改变时,所有基于同一组数据的图像显示都需要修改图像,那么此时有两种实现方式:1、所有图形界面模块都去观察底层数据是否做了改变,如果变化,那么读取数据,修改图像显示。

ljy的博客 1474

squirrel校园二手交易平台

squirrel校园二手交易平台 (适合寻找SSM项目练手的你。) 项目起源:   期末的课程设计,三人一组,我和两个舍友,一时起兴,决定做一个校园二手交易平台,一开始兴致与激情满满,可是后期时间上的冲突,让我们三个人对于这个项目有点累。   这个项目刚定题两天,BezosLee由于通过了360的网上在线笔试,收到了360公司的免费培训邀请,要去北京的360总部进行培训一周,值得庆...

K.SHI的博客 5万+

qmt量化交易策略小白学习笔记第67期【qmt编程之获取ETF申赎清单】

qmt编程之获取ETF申赎清单

fanglue3705的博客 1773

【设计模式】观察者模式Observe(Java)

观察者模式定义了对象之间的一对多依赖,这样以来,当一个对象改变状态时,他的所有观察者都会收到通知并且自动更新。

鹏啊鹏 1683

【实用运维脚本】Windows 批量 TCP 端口检测(tcping 一键巡检)

摘要:本文介绍一款高效的Windows批量TCP端口检测脚本,适配tcpingv0.39工具,实现多服务器一键巡检。脚本具有进度可视化、双日志输出、自动容错等优势,支持注释行过滤和UTF-8编码。 使用仅需三步: 1)下载tcping工具 2)编辑目标列表 3)运行脚本即可自动检测并生成带编号的检测报告。 该方案解决了手动检测效率低、易遗漏的问题,特别适合日常运维中的端口连通性检查,实测稳定可靠,开箱即用。

蕲士|D365 & 服务器运维,心有东坡,行稳致远。 798

设计模式之观察者模式详解(附应用举例实现)

详细介绍了观察者模式,通过一个军队游戏实例实现了观察者模式

pursuit的博客 1万+

ESP32S3开发实战:从Vscode+IDF环境配置到OpenOCD单步调试全流程

本文详细介绍了ESP32S3开发环境的完整搭建流程,重点讲解如何在Vscode中配置ESP-IDF开发框架,并利用OpenOCD工具实现硬件单步调试。内容涵盖从环境准备、工程创建、代码烧录到高级调试技巧的全方位实战指南,旨在帮助开发者快速掌握ESP32S3的高效开发与调试方法。

weixin_29168813的博客 208

Python爬虫:爬取健身平台运动数据(跑步、骑行轨迹)

通过分析这些运动数据,用户能够了解自己的运动趋势、运动成绩,并作出相应的调整。通过使用Strava的API,我们成功地获取了用户的运动活动信息和运动轨迹数据,并进行了存储与可视化。Strava的API提供了丰富的数据接口,能够通过OAuth2认证获取用户的运动数据,包括历史数据、运动轨迹等信息。Strava的API还提供了获取活动轨迹数据的接口,返回的数据格式通常是GeoJSON格式,适用于地图可视化。随着大数据技术的发展,运动数据的分析和可视化为个人健康管理、运动训练计划的优化等提供了强大的支持。

2201_76125261的博客 1075

20-观察者模式Quarkus实现

摘要:本文用一个实例场景描述Gof 23设计模式中的观察者(Observer)模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型。 关键字:Gof 23 设计模式 观察者模式 Quarkus 1 基础知识 1.1 标准定义 观察者(Observer)模式标准定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 1.2 分析和说明 观察者(Observer)模式属于对象行为型模式。观察者模式定义了一种一对多的依赖关系,让多个观察

rengang66的博客 455

【OpenClaw从入门到精通】第15篇:国产芯片适配实战——昇腾/龙芯/天数智芯全流程跑通(2026实测版)

2026年国产芯片AI适配迎来爆发期,OpenClaw作为轻量化本地AI智能体,已实现华为昇腾、龙芯、天数智芯等主流国产平台的全流程适配。本文基于实测数据,从背景解析、核心原理、算法优化、实操部署四个维度,详细讲解OpenClaw在香橙派昇腾开发板、龙芯3B6000M、天数彤央TY1200及联想开天X7h的部署流程,同时提供统一工具玄武CLI的使用指南。文中包含完整代码、执行结果、避坑技巧及虚拟实战案例,兼顾新手入门与进阶提升,帮助读者快速掌握国产芯片上的本地AI部署能力,实现数据隐私保护与低成本AI落地。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1005

观察者模式(Observer Pattern)案例解析

观察者模式(Observer Pattern)案例解析 案例描述: 有一个雷达负责扫描目标,一旦发现目标,就会通知攻击序列对目标进行摧毁,攻击序列中的所有武器会向目标发动攻击。 现有的武器可以加入攻击序列,也可以退出攻击序列。 雷达扮演Subject,大炮和导弹扮演Observer,大炮和导弹通过attach加入到雷达的攻击序列,一旦雷达发现目标,启动攻击序列摧毁目标。

1161

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Observer Pattern ——(观察者模式)

Observer Pattern 观察者模式定义 观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 — 维基百科 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。 在观察者模式中也有两个主

qq_38376634的博客 320

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

观察者模式(observer pattern)

观察者模式: 定义了subject和observer之间的一对多依赖,当subject状态改变时,所有的observer都会收到通知。 结构图: C++实现: class Observer; class Subject { public: virtual void attach(Observer *o) = 0; virtual void det...

weixin_33721427的博客 255

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Observer Pattern 观察者模式

Publisher, Subject Subscriber, Observer Observer Pattern: defines a one-to-many dependency between objects so that when one object changes state, all of its dependents are notified and updated a

Geurney的专栏 722

sincerit 观察者模式(Observer Pattern)

目标(Subject)即观察者观察的对象 观察者(Observer) 观察者模式:主要特点是对象之间是一对多的依赖关系,每当目标(subject)的状态发生改变时,其相关的观察者(observer)做出相应的行为 观察者模式:由一个Subject抽象目标类,ConcreteSubject具体目标类,Observer抽象观察者,ConcreteObserver具体观察者组成 观察者模式:是23种设计...

sincerit的博客 440

设计模式之观察者模式(Observer Pattern)

观察者模式定义 Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 定义对象之间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到...

程铭程铭你快成名的博客 3589

观察者模式(Observer Pattern)

观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 案例一 天气预报需求 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方) 需要设计开放型API,便于其他第三方也能接入气象站获取数据 提供温度、气压和湿度的接口 测量数据更新时, 要能实时的通知给第三方 /** * 核心类 * 1. 包含最新的天气情况信息 * 2. 含有 Cur

jsxllht的博客 221

Observer Pattern(观察者模式)

<br />观察者模式应用比较广泛,写一个简单的示例,扩展了一下Head First上面例子的应用范围,进一步降低Observer与Subject之间的耦合度。<br />简单例子,直接给代码:<br />package test; public interface Subject { public void registerObserver(Observer observer); public void unRegisterObserver(Observer observer); publi

lmc_wy的专栏 848

观察者模式Observer Pattern

观察者模式定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体,当主体对象发生变化时,它的所有观察者都会收到通知。观察者模式也叫发布订阅模式,主要用于在关联行为之间建立一套触发机制的场景。 下面通过我们平时最常用的键盘鼠标相关的监听事件作为例子,来熟悉观察者模式。 一、首先创建Event类 public class Event { // 事件源,事件是由谁发起的,保存起来 ...

qq_37254296的博客 291

观察者模式(Observer Pattern)

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

ChineseSoftware的博客 3805

Java Observer Pattern(观察者模式)

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 关键代码:在抽象类里有一个 ArrayList 存放观察者们。 优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。 缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将...

mazaiting的博客 210

Java - 【设计模式】观察者模式(Observer Pattern)

设计模式 - 观察者模式(Observer Pattern) -> 解决问题:一个对象的状态发生改变,如何通知其他对象? 被观察对象(Subject) 观察对象(Observer) -> 注意: 互相指定,互相包含! 一:被观察对象(Subject) 1> 维护一个可变对象,该对象变化对应一个方法,该方法内部需要通知所有观察者(notifyAllObservers) private int state; public void setState(int state) {

⚡ 578
上一篇: 策略模式
下一篇: 装饰模式(Decorator)
付家明1
博客等级 码龄14年 0粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值