设计模式之观察者模式

openEuler系统下安装Google Chrome浏览器全攻略(附依赖问题解决方案) 本文详细介绍了在openEuler系统上安装Google Chrome浏览器的完整指南,包括环境准备、多种安装方式、依赖问题解决方案及性能优化技巧。针对openEuler特有的软件生态和依赖管理机制,提供了实用的命令和配置方法,帮助用户克服安装过程中的常见障碍,实现流畅的Chrome使用体验。 阅读详情

本文主要为大家介绍观察者模式的定义,特点以及如何实现一个观察者模式。在手动实现观察者模式之后,也会为大家介绍JDK内置观察者模式的使用。

定义

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

观察者模式的特点就是观察者和被观察者是抽象耦合的。被观察者只知道观察者对象实现了公共的接口(Observer),不知道观察者对象具体是谁,更加不知道它们的行为。另外,我们可以任意的添加或者删除观察者,被观察者不会受到任何影响。使用观察者模式,我们可以设计出很好的松耦合系统。

使用场景

1.当一个对象更新时,需要同步其它对象的状态,并且其它对象的数量是不确定的。

2.对象只需要将自身更新状态通知过去,不需要知道其它对象细节。

自定义实现

在实现观察者模式的时候,我们通常需要依赖两种类型的对象:观察者和被观察者。通常我们又把被观察者叫做主题,观察者又被叫做订阅者。大家试想一下,如果我们自己实现观察者模式,我们应该怎样开始呢?上面已经介绍到观察者模式中的对象是一对多的关系,不难猜测出这种关系应该是被观察者 1—— n 观察者,要想实现这种关系,那么被观察者对象就需要包含观察者对象的集合,这样才能在自身内部发生变化的时候,把这种变化传递给观察者对象。观察者需要向被观察者注册、注销自己,那么就需要包含被观察者的对象。通过我们的推测,代码大概是这个样子的:

被观察者类(主题):

public class Subject {
    //用于判断主题(被观察者)自身状态是否改变
    boolean changed = false;
    //具体内容
    String message;
    //用于存放注册的观察者(订阅者)
    private List<Observer> observers = new ArrayList<>();

    public void add(Observer observer) {
        this.observers.add(observer);
    }

    public void remove(Observer observer) {
        this.observers.remove(observer);
    }

    public void setMessage(String message) {
        this.message = message;
        this.changed = true;
        notifyObservers();
    }

    //用于通知所有观察者
    public void notifyObservers() {
        if (changed) {
            for (Observer observer : observers) {
                observer.update(this.message);
            }
            this.changed = false;
        }
    }
}

观察者类(订阅者):

public interface Observer {
    void update(String message);
}

//观察者一
class FirstObserver implements Observer {
    //被观察类
    private Subject subject;

    public FirstObserver(Subject subject) {
        this.subject = subject;
        this.subject.add(this);
    }

    @Override
    public void update(String message) {
        System.out.println("观察者一接受到消息:" + message);
    }
}

//观察者二
class SecondObserver implements Observer {
    //被观察类
    private Subject subject;

    public SecondObserver(Subject subject) {
        this.subject = subject;
        this.subject.add(this);
    }

    @Override
    public void update(String message) {
        System.out.println("观察者二接受到消息:" + message);
    }
}

测试:

Subject subject = new Subject();
FirstObserver firstObserver = new FirstObserver(subject);
SecondObserver secondObserver = new SecondObserver(subject);
subject.setMessage("华为投诉美国政府");
subject.setMessage("5G时代即将来临");

上述是我们自己实现的一个简单版的观察者模式,核心内容基本就是这些,但是我们仔细观察,这里面还是有很大的问题的,例如我们的集合使用的是List,这样可能会导致一个对象被注册多次,另外我们上述的注册和注销操作都没有考虑线程不安全的情况,在多线程操作的情况下,可能出现异常。当然,当我们知道这些问题之后,可以继续优化,但是有这个必要吗?其实,JDK已经为广大开发者提供了观察者与被观察者的实现,我们自己写观察者模式,只是为了加深对它的了解,更多的时候不需要我们自己去实现,当然,自己实现也比较简单。

JDK观察者模式实现

上述我们所实现的观察者模式,是一个典型的推模式,也就是被观察者主动推送消息给观察者对象,无需观察者手动获取消息,这是我们通常使用的方式。在某些特殊的情况下,各个观察者可能需要的消息内容不一样,没有必要全部推送,这个时候就可以使用拉模式。JDK已经很好的实现了两种方式,现在我们就来具体使用一下。

被观察者:通过继承Observable来实现,已经封装好注册、注销观察者相关方法。

public class NewsObservable extends Observable {
    //技术类新闻
    private String technology;
    //娱乐新闻
    private String entertainment;
    //军事新闻
    private String military;

    public void changed() {
        //改变自身状态
        setChanged();
        //这里使用推模式传递消息,通知完毕后,改变状态会被清空
        notifyObservers(this.technology);
    }

    //用于修改新闻
    public void setNews(String technology, String entertainment, String military) {
        this.technology = technology;
        this.entertainment = entertainment;
        this.military = military;
        changed();
    }

    public String getTechnology() {
        return technology;
    }

    public String getEntertainment() {
        return entertainment;
    }

    public String getMilitary() {
        return military;
    }

}

观察者:通过implements Observer实现观察者。

public class CustomObserver implements Observer {

    //Observable就是我们的被观察对象
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("获得消息:" + arg);
    }
}

测试:

NewsObservable newsObservable = new NewsObservable();
CustomObserver customObserver1 = new CustomObserver();
CustomObserver customObserver2 = new CustomObserver();
//用于注册观察者
newsObservable.addObserver(customObserver1);
newsObservable.addObserver(customObserver2);
newsObservable.setNews("技术新闻", "娱乐新闻", "军事新闻");
//用于注销观察者
newsObservable.deleteObserver(customObserver2);
newsObservable.setNews("技术新闻1", "娱乐新闻1", "军事新闻1");

上述在被观察者类中,我们使用notifyObservers(Object args);方法进行通知观察者对象,该方法在传递参数的时候就是推模式,不传递参数的时候就是拉模式。如果我们想使用拉模式获取消息,如下操作:

@Override
public void update(Observable o, Object arg) {
    NewsObservable newsObservable= (NewsObservable)o;
    System.out.println("获得消息:" + newsObservable.getEntertainment()+":"+newsObservable.getTechnology());
}

采用JDK内置的观察者模式实现,我们无需关注观察者的注册、注销等相关行为,并且内置的观察者模式采用Vector保存观察者对象以及使用synchronized,保证了在多线程使用中能够做到线程安全,大家有空可以去看看源码,比较简单。

总结

观察者模式有助于我们建立松耦合的系统,针对不同的业务环境,大家可以采用推模式或拉模式。JDK提供内置观察者模式供开发者使用,若不能满足大家的需求,手动实现也是比较简单。

 

解锁机器人动态平衡算法:从原理到实践 机器人的动态平衡,是指机器人在运动过程中,面对各种复杂的动态变化和外界干扰,依然能够维持稳定状态,不发生倾倒或失去控制的能力。它就像是一位技艺精湛的舞者,在舞台上翩翩起舞时,无论做出多么复杂的动作,都能巧妙地调整身体姿态,始终保持平衡,展现出优美的舞姿。在实际应用中,机器人的动态平衡对于其稳定运行起着至关重要的作用。以双足机器人为例,当它行走在不平整的地面上时,地面的起伏会使机器人的重心不断发生变化。如果没有良好的动态平衡能力,机器人就很容易因为重心偏移而摔倒,无法完成行走任务。 阅读详情

相关推荐

三菱CNC数据采集实战:从环境搭建到代码实现的完整指南

本文提供了一份完整的三菱CNC数据采集实战指南,涵盖从开发环境搭建、核心SDK获取、网络配置到基于C#和A2协议的完整代码实现。文章详细解析了初始化、连接管理、数据获取与展示四大核心模块,并分享了错误处理、性能优化及与MES系统集成的关键技巧,帮助工程师快速构建稳定可靠的工业数据采集系统。

wood5的博客 891

观察者模式+事件委托(JAVA版)

观察者模式+事件委托观察者模式1.定义2.实现使用JDK工具包实现自定义实现事件委托1.定义2.实现 观察者模式 1.定义 观察者模式又叫做发布-订阅(Publish/Subscribe)模式。定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 2.实现 使用JDK工具包实现 具体主题或具体通知者 package com.design.pattern.observer.jdk; import java.util

weixin_42794011的博客 681

数据清洗(Data Cleansing)

数据清洗(Data Cleansing)是指对数据进行处理和纠错,以去除或修复数据集中存在的错误、不致、不完整和冗余的数据,从而使数据更加准确、可靠和有用。数据清洗是数据处理和数据分析中一个非常重要的步骤,它可以帮助我们提高数据的质量,从而提高数据分析和机器学习的准确性和可靠性。数据清洗是一个重要的过程,它可以帮助我们提高数据的质量,从而提高数据分析和机器学习的准确性和可靠性。在实际应用中,我们可以使用一些工具和技术来实现数据清洗,例如 Pandas、NumPy 和 OpenRefine 等。通过数据清洗,

meimei169500的博客 1万+

设计模式学习笔记(二)之观察者模式(Observer)

上次学习了单例模式(点击进入:单例模式),今天趁空学习了一下观察者模式; 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。 在观察者模式中,有抽象主题角色(Subject),具体主题角色(ConcreteSubject),抽象观察者角色(Obser...

weixin_33814685的博客 146

告别环境配置噩梦:VSCode + MinGW 下 OpenGL (glad/glm/glfw) 一站式配置指南(含常见错误排查)

本文提供了一份详细的VSCode与MinGW下OpenGL开发环境配置指南,涵盖glad、glm和glfw三大核心库的安装与调试。通过逐步指导解决常见错误,帮助开发者快速搭建高效的OpenGL开发环境,特别适合初学者避免环境配置中的常见陷阱。

weixin_42557803的博客 491

Android开发者必看:5分钟搞定DeepSeek API接入(附完整代码示例)

本文为Android开发者提供快速接入DeepSeek API的完整指南,包含环境配置、网络层设计、请求体构建等关键步骤,并附有详细代码示例。通过工程化实践,帮助开发者高效集成AI对话、代码生成等高级功能,提升移动应用竞争力。

bush的博客 540

【笔记】高并发编程第二阶段13讲、使用观察者设计模式观察线程的生命周期

1.先定义一个subject,线程状态或者里面的数据的变化会主动通知 public abstract class ObservableRunnable implements Runnable { final protected LifeCycleListener listener; //observer public ObservableRunnable(final LifeC...

中国华的博客 234

DSP TMS320F280049之CCS工程的建立(库函数版)

TMS320F280049 DSP是TI最新出的一款C2000系列的DSP,主频为100MHZ,功能较为强大,具有较多的片上模拟外设。这一节主要讲述如何新建F280049的CCS工程。 Step1.下载文件: 下载C2000Ware软件并安装。下载地址如下: http://www.ti.com.cn/tool/cn/C2000WARE?keyMatch=C2000Ware%2...

fanxianyan1993的博客 1万+

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

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

Worthy_Wang的博客 622

PON架构(全光网络)

目前组网架构世界上有一种最快的速度又是光,以前传统以太网络规划满足不了现在的需求。有线网 无线网 全光网络方案场景 全光网络分类 以太全光网络 PON(Pas-sive-Optical Network 无源光网络) 再典型的中大型高校网络中 推荐万兆入室 千兆到桌面的带宽设计 一般三层 (终端-接入层-汇聚层-核心层-出口(安全设备)-互联网) 单校区核心设备 一般采用两台高性能的核心交换机 双机的方式采用的是 M-LAG 多校区之间核心交换机采用1

qq_56248592的博客 6269

把 ABAP 经验装进 GitHub Copilot 的按需大脑,Agent Skills 如何改变 ABAP 开发

2026 年 8 月,SAP Community 上出现了一次很有代表性的 ABAP 实验。开发者把标准 Flight Model 里的复制成自己的测试类,删除原有 ABAP Unit Test,再让 GitHub Copilot Agent 为方法重新生成测试代码。真正有意思的地方并不是 Copilot 会不会写,而是开发者给 Copilot 准备了两个专门的 Agent Skills,一个负责 ABAP Unit Test 的通用规则,一个负责 ABAP Test Double Framework。

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

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

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

徐泗空的博客 1047

【目标跟踪】基于Kalman滤波实现无人机运动轨迹跟踪附matlab代码

1 简介 在近代控制中,需要对某一特定的运动目标进行跟踪监测,并需要对其下一时间的运动位置,运动方向,速度等信息进行预先估算,才能达到对目标的即时控制.本文简要讨论了用卡尔曼滤波算法对单个目标航迹进行预测,并借助于Matlab仿真工具,对实验的效果进行评估. 2 部分代码 clc; close all; %initial state xo=25; vox=2; %Observations **** % X-Direction Calcula

qq_59747472的博客 4731

设计模式之ObserverPattern观察者模式

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

haoyuegongzi的博客 326

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

设计模式-观察者模式

观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。本文以AbstractCursor为例子,展开分析。观察者模式,Observer Pattern,是一个很实用的模式,本人曾经接触到的各种平台以及曾经参与项目中打印模板解释器中都用到了此模式。 1.意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知...

weixin_34268843的博客 285

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

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

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

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

wesigj的博客 1483

计算机控制技术及应用

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

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

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

Bankcary的博客 632

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

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

kaven 1451

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

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

bbllbbcpt的专栏 305

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

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

weixin_39974223的博客 110

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

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

遇见伯灵说的博客 1246

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

六大原则:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则。 二十三设计模式:单例模式、Builder 模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察者模式

Mr_Four 310

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

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

Meteors.的博客 1224

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

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

1101

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

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

guoguojiang_的博客 1003
上一篇: 存储过程
下一篇: 设计模式之单例模式
西红柿丶番茄
博客等级 码龄10年 21粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值