设计模式-观察者模式

设计模式之观察者模式 本文先是介绍了观察者模式,给出定义、重要的角色、具体的代码实现。然后介绍了EventBus,从使用到刨析原理。最后我们又简单地对照了一下观察者模式和监听器模式。 阅读详情

概述:


定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

解决的问题


将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。

模式中的角色


  • 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
  • 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
  • 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  • 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

代码实现(Java)


package com.mode.observer;

import java.util.ArrayList;

/**
 * 观察者操作类
 */
public abstract class Observable<T> {

    protected final ArrayList<T> mObservers = new ArrayList<T>();

    /**
     * 添加观察者
     */
    public void registerObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized (mObservers) {
            if (mObservers.contains(observer)) {
                throw new IllegalStateException("Observer " + observer + " is already registered.");
            }
            mObservers.add(observer);
        }
    }

    /**
     * 删除某个观察者
     */
    public void unregisterObserver(T observer) {
        if (observer == null) {
            throw new IllegalArgumentException("The observer is null.");
        }
        synchronized (mObservers) {
            int index = mObservers.indexOf(observer);
            if (index == -1) {
                throw new IllegalStateException("Observer " + observer + " was not registered.");
            }
            mObservers.remove(index);
        }
    }

    /**
     * 移除全部观察者
     */
    public void unregisterAll() {
        synchronized (mObservers) {
            mObservers.clear();
        }
    }
}

package com.mode.observer;

/**
 * 观察者通知方法接口
 */
public abstract class DataSetObserver {
    public abstract void onChanged();
}

package com.mode.observer;

/**
 * 通知观察者类
 */
public class DataSetObservable extends Observable<DataSetObserver> {
    /**
     * 数据发生变化时,通知所有的观察者
     */
    public void notifyChanged() {
        synchronized (mObservers) {
            for (DataSetObserver observer : mObservers) {
                observer.onChanged();
            }
        }
    }
}

调用:


package com.mode.observer;

public class ObTest {
    // 观察者类
    public static DataSetObservable mDataSetObservable = new DataSetObservable();

    // 观察者模式
    static class NewDataObServer extends DataSetObserver {
        public void onChanged() {
            // 被观察者执行操作时候,则刷新,例如刷新adapter,或者其他操作
            // Adapter.notifyDataSetChanged();
        }
    }

    // 注册观察者
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

    // 注销观察者
    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }

    public static void main(String[] args) {
        ObTest obTest = new ObTest();
        // 观察者类
        NewDataObServer newDataObServer = new NewDataObServer();
        // 注册观察者
        obTest.registerDataSetObserver(newDataObServer);
        // 注销观察者
        // obTest.unregisterDataSetObserver(newDataObServer);

        // 在Android中则把mDataSetObservable放在Application中
        // 通知观察者需要更新数据
        ObTest.mDataSetObservable.notifyChanged();
    }
}

案例理解:


其实观察者模式就是让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
让主题和观察者之间松耦合。改变主题或者观察者其中一方,并不会影响另一方

例:Android广播机制(Broadcast Receiver)就是使用了观察者模式
当我需要监听网络状态是否发生改变时,只需要注册对应的监听类型,当有网络状态发生改变时,系统触发广播提醒你(如上调用:onChanged())

模式总结


  1. 优点
    • 观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。
  2. 缺点
    • 依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者。
  3. 适用场景
    • 当一个对象的改变需要给变其它对象时,而且它不知道具体有多少个对象有待改变时。
    • 一个抽象某型有两个方面,当其中一个方面依赖于另一个方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。

代码下载


观察者模式ObserverMode - 8KB


参考:
- 观察者模式(百度百科)
- http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html
- http://www.cnblogs.com/mengdd/archive/2013/01/03/2843298.html
- http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html


【100%通过率】华为od统一考试B卷【需要打开多少监视器】JAVA&Go 实现 某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开:给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器 阅读详情

相关推荐

Python在Windows环境下驱动乐视三合一摄像头的深度图像处理实践

本文详细介绍了在Windows系统下,使用Python驱动乐视三合一摄像头进行深度图像处理的完整实践流程。从环境配置、驱动安装、OpenNI与OpenCV库的部署,到深度与彩色数据流的读取、可视化、三维点云转换以及背景移除等应用开发,为开发者提供了从零开始掌握深度摄像头编程的实战指南。

gitlab7runner的博客 232

JAVA设计模式总结之23种设计模式(重点!!!)

JAVA设计模式总结之23种设计模式:一、什么是设计模式设计模式遵循的原则有6个:二、设计模式的三个分类三、各分类中模式的关键点四、概说23种设计模式1.单例模式(Singleton)2.工厂方法模式(Factory Method)3.抽象工厂模式 (Abstract Factory)4.建造者模式(Builder)5.原型模式 (Protype)6.适配器模式 (Adapter)7.桥接模式8.组合模式9.装饰模式10.外观模式11.亨元模式12.代理模式13.访问者模式14.模板模式15.策略模式16

LonE li 2070

从NVLINK到EthLink:GPU互联技术演进全解析(含最新行业趋势)

本文深入解析了从NVLINK到EthLink的GPU互联技术演进,重点剖析了Scale-up与Scale-out两种核心范式。文章详细对比了NVLINK、UALINK及革命性的EthLink技术,后者创新性地将以太网改造为支持Load/Store与RDMA双语义的高性能互联网络,旨在打破封闭生态,实现高性能与开放性的统一。最后,文章提供了技术选型指南并展望了未来以以太网为主导、语义融合的行业趋势。

weixin_29204749的博客 177

浅谈为什么设计模式要有观察者模式--观察者模式的意义

2019年10月12日04:08:46 设计模式不是解决业务逻辑问题, 而是为了解决开发管理的一种规范思路, 所以两年前我的例子是错误的, 如有读者建议直接去看一些视频老师的讲解, 此处留着警示自己! _______________________________________________________________________________________________ ...

houzhyan-博客 1万+

Linux命令行入门:从零掌握服务器运维与Shell脚本基础

在信息化时代,操作系统是数字世界的基石,而终端命令行则是高效驾驭服务器的核心技能。无论是软件部署、服务监控还是故障排查,掌握基于Shell的指令操作都能大幅提升工程效率。从最基础的文件目录管理、文本处理,到权限控制、进程监控与网络调试,命令行提供了一套强大且可自动化的操作范式。尤其对于运维工程师和开发者而言,理解管道、重定向以及脚本化任务,意味着将重复劳动转化为可复用的自动化流程。本文从环境准备讲起,系统梳理常用Linux命令的实际场景与输出验证,并延伸至Shell脚本编写与定时任务,帮助初学者快速建立从操

weixin_30522983的博客 255

MoveIt2项目想换掉KDL求解器?试试这个trac_ik插件(附源码编译避坑指南)

本文详细介绍了如何在MoveIt2项目中用trac_ik插件替代KDL求解器,提升机械臂运动学求解的效率和成功率。内容涵盖环境准备、源码编译避坑、项目集成及性能调优,特别适合需要高精度控制的协作机械臂应用场景。通过实测数据对比,trac_ik在求解时间和奇异点处理上显著优于传统KDL求解器。

weixin_30730053的博客 692

设计模式之观察者模式(ObserverPattern)

设计模式之观察者模式(ObserverPattern) 文章目录设计模式之观察者模式(ObserverPattern)一.观察者模式(ObserverPattern)二.编程实例1.进制转换器2.客人敲门案例 一.观察者模式(ObserverPattern) 在生活中会遇到很多使用观察者模式的案例,比如股票跌涨后,股民作为观察者会对股票进行交易;客人来敲门,门铃响了之后管家就会去开门等等。其中观...

Worthy_Wang的博客 622

MOS管的体二极管在LLC中的作用

MOSFET是一个三端器件(G、D、S),在N沟道MOSFET的结构中,源极和漏极之间的N型材料中自然形成了一个寄生的PN结,这个PN结就是体二极管(Body Diode),它是不可避免的器件结构。📌 对于N沟MOSFET:体二极管是从漏极 D 到源极 S 的正向导通二极管,方向为 D → S。MOS管的体二极管在LLC中并不是主功率通道,但却是实现软开关(ZVS)和能量过渡的关键“临时路径”。用得好,它是你的朋友;忽略它,电路就可能烧毁。

weixin_43199439的博客 699

设计模式之观察者模式ObserverPattern(十一)

观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。

徐泗空的博客 1047

《多模态融合改进》目录一览 | 专栏介绍 :全网 第一份 完整的多模态改进教程,提供《多模态模型改进完整项目包》-开箱即用

在大家订阅专栏后,便可获得多模态模型改进完整项目包-开箱即用,方便简单

Limiiiing的博客 1万+

【2025最新版】间接平差——以水准网平差为例 (python详细过程版)

水准网间接平差的python代码实现。博客长期更新,本文最新更新时间为:2025年5月20日。

点云侠的博客 1702

设计模式之ObserverPattern观察者模式

现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。 在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系。所有这些,如果用观察者模式来实现就非常方便。 观察者Observer模式的特点和定义: 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一

haoyuegongzi的博客 326

深度解构事务码 SQF:Support Query Framework 与 ABAP 静态分析实战

某制造企业在年度审计前,需要确认自定义发票过账程序 ZFI_INV* 系列是否存在硬编码公司代码与未捕获异常。技术团队在字段填入ZFI_INV*后,勾选与规则,执行扫描。SQF 生成的 ALV 报告列出 42 个警告,其中 17 条与抛出 CX_SY_NO_HANDLER 相关,8 条涉及动态 SQL 注入风险。结果导出至 Excel 供开发整改,并在 ATC 阶段验证修复。此过程较手工逐个执行 Code Inspector 节省超 80 % 时间。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 216

设计模式-观察者模式-Observer Pattern

观察者模式的优点包括实现了观察者和被观察者之间的解耦,增加了程序的可扩展性,并且可以动态地添加或移除观察者。:观察者模式能够将被观察者(Subject)和观察者(Observer)解耦,使得被观察者的改变不会直接影响到观察者,两者之间的依赖关系降低。:在需要实现通知和消息传递的系统中,观察者模式可以用来通知用户或系统组件关于状态变化的信息,如电子邮件客户端中的新邮件通知。:在观察者模式中,如果一个观察者在更新时发生错误,可能会影响到其他观察者的更新,这需要在设计时考虑错误处理机制。

wesigj的博客 1482

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

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【24种设计模式】观察者模式(Observer Pattern)

这种模式实现了一种一对多的对象依赖关系,当一个对象的状态改变时,所有依赖它的对象都会得到通知并自动更新。总结起来,观察者模式通过定义主题和观察者之间的接口,实现了一种松耦合的对象间通信方式。观察者模式中,通知观察者的算法骨架是固定的,但具体的通知操作可以由不同的观察者进行实现。在状态模式中,状态的改变会导致行为的改变,而在观察者模式中,状态的改变会导致通知给观察者。发布-订阅模式:发布-订阅模式是观察者模式的一种扩展,它将观察者分组,通过消息队列、事件总线等机制实现观察者与主题之间的松耦合通信。

Bankcary的博客 632

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

观察者模式 定义 观察者模式,又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象。 类型 行为型。 角色 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。 具体主题(Co...

kaven 1451

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

设计模式——行为型——观察者模式ObserverPattern

https://en.wikipedia.org/wiki/Observer_pattern

bbllbbcpt的专栏 304

c++ 设计模式_设计模式行为型:观察者模式(ObserverPattern)

定义对象之间的一种一对多依赖关系,使得每一个对象发生状态的变化时,其相关依赖对象皆得到通知并被自动更新,又称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependence)模式。结构图角色与理解观察者模式共分为四种角色: Subject(目标类):被观察的对象,内部定义一个观察者集合,并...

weixin_39974223的博客 110

设计模式教程:观察者模式(Observer Pattern)

定义对象之间的一对多依赖关系,当一个对象状态变化时,所有依赖于它的对象都会得到通知并自动更新。

遇见伯灵说的博客 1245

设计模式之观察者模式(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

23种设计模式——观察者模式(Observer Pattern)​详解

本文介绍了23种经典设计模式之——观察者模式(Observer Pattern)​的说明及使用。

Meteors.的博客 1224

Java 设计模式——观察者模式(Observer Pattern)

    前言 一、简介 二、实现步骤 (1)实现方式: (2)举例: (3)步骤简化版: 三、代码实现 四、总结 五、Demo地址 六、参考文档 七、内容推荐 前言 本来没想写前言的,感觉就是一堆废话。那就当废话浏览一下吧,只是提醒一下自己一些注意的东西。 在许多博客当中看到把观察者模式又称呼为发布-订阅模式。其实我感觉两者确实很相似,但还是有一丢丢的区别: 在...

斌林诚上的博客 726

设计模式中的观察者模式(Observer Pattern)

在软件开发中,经常遇到对象之间存在依赖关系的情况,例如GUI 组件事件处理、消息订阅系统、股票价格更新、数据监听等。如果使用传统的方法(如轮询),不仅浪费资源,还可能导致数据不同步。观察者模式(Observer Pattern)提供了一种一对多的依赖关系,当被观察对象(Subject)状态发生变化时,会自动通知所有观察者(Observer),从而实现低耦合、自动更新的通知机制。本文将详细介绍观察者模式的概念、应用场景,并通过 Python 代码示例展示其实现。

1100

设计模式之观察者模式(Observer Pattern),C++篇

观察者模式是一种行为设计模式,用于对象间一对多的依赖关系。当被观察对象状态改变时,会自动通知所有依赖的观察者。该模式包含四个核心角色:主题(Subject)、观察者(Observer)、具体主题(Concrete Subject)和具体观察者(Concrete Observer)。适用场景包括事件处理系统、消息传递等需要松耦合通知机制的场合。代码示例展示了C++实现,通过主题维护观察者列表,在状态变化时循环通知所有观察者进行更新。该模式有效降低了对象间的耦合度,适用于状态变化引发连锁反应的系统设计。

guoguojiang_的博客 1003
上一篇: 设计模式-前言
下一篇: 设计模式-单例模式
「已注销」
博客等级 码龄11年 14粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值