GOF 23 设计模式之 观察者模式(Observer)

趋势跟踪策略 / 绘制K线图的下跌部分,使用绿色标记 stickline(close>=open,high,close,1,1,colorgreen);end // 在图表上绘制当前趋势的图标,如果trend=1或-1 drawicon(trend=1,stopprice,10);end // 绘制K线图的上涨部分,使用红色标记 stickline(close>=open,high,close,1,1,colorred); 阅读详情

场景

  • 聊天室程序的创建。服务器创建好后,A,B,C三个客户端连上来公开聊天。A向服务器发送数据,服务器端聊天数据改变。我们希望将这些聊天数据分别发给其他在线的客户。也就是说,每个客户端需要更新服务器端的数据
  • 网站上,很多人订阅新闻。当有某个主题的新闻时,就会将这些新闻发给所有订阅的人。
  • 大家一起玩CS游戏时,服务器需要将每个人的方位变化发送给所有的客户。
  • 上面这些场景,我们都可以使用观察者模式来处理。我们可以把多个订阅者、客户称之为观察者;需要同步给多个订阅者的数据封装到对象中,称之为目标。

核心

  • 观察者模式主要用于1:N的通知。当一个对象(目标对象Subject或Objservable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observer),令他们作出响应
  • 通知观察者的方式:
    • 推:每次都会把通知以广播的方式发送给所有观察者,所有观察者只能被动的接收
    • 拉:观察者只要知道有情况即可。至于什么时候获取内容,获取什么内容,都可以自主决定。

自定义代码

  • Observer
package com.coderbean.observer;


/**
 * Created by Chang on 15/10/5.
 */
public interface Observer {
    void update(com.coderbean.observer.Subject subject);
}
  • ObserverA
package com.coderbean.observer;

/**
 * Created by Chang on 15/10/5.
 */
public class ObserverA implements Observer {

    private int myState;


    public int getMyState() {
        return myState;
    }

    public void setMyState(int myState) {
        this.myState = myState;
    }

    @Override
    public void update(Subject subject) {
        this.myState = ((ConcreteSubject)subject).getState();
    }
}
  • Subject
package com.coderbean.observer;

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

/**
 * Created by Chang on 15/10/5.
 */
public class Subject {

    private List<Observer> list = new ArrayList<Observer>();

    public void registerObserver(Observer observer){
        list.add(observer);
    }

    public void removeObserver(Observer observer){
        list.remove(observer);
    }
    //通知所有的观察者更新状态
    public void notifiyAllObservers(){
        for(Observer observer : list){
            observer.update(this);
        }
    }
}
  • ConcreteSubject
package com.coderbean.observer;

/**
 * Created by Chang on 15/10/5.
 */
public class ConcreteSubject extends Subject {
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        // 目标对象值发生变化,通知所有观察者更新
        this.notifiyAllObservers();
    }
}
  • Client
package com.coderbean.observer;

/**
 * Created by Chang on 15/10/5.
 */
public class Client {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        //创建多个观察者对象
        ObserverA observer = new ObserverA();
        ObserverA observer1 = new ObserverA();
        ObserverA observer2 = new ObserverA();


        // 添加到subject中
        subject.registerObserver(observer);
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);

        //改变subject的状态
        subject.setState(3000);

        //观察着的状态
        System.out.println(observer.getMyState());
        System.out.println(observer1.getMyState());
        System.out.println(observer2.getMyState());


    }
}

使用JavaSE中的类实现

  • ConcreteSubject
package com.coderbean.observer2;

import java.util.Observable;

/**
 * Created by Chang on 15/10/5.
 * 目标对象
 */
public class ConcreteSubject extends Observable {
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state){
        this.state = state;

        setChanged();   //表示目标队形已经做了更改
        notifyObservers(state);  //通知所有的观察者
    }
}
  • ObserverA
    “`java
    package com.coderbean.observer2;

import com.coderbean.observer.*;

import java.util.Observable;
import java.util.Observer;

/**
* Created by Chang on 15/10/5.
*/
public class ObserverA implements Observer {

private int state;

public int getState() {
    return state;
}

public void setState(int state) {
    this.state = state;
}

@Override
public void update(Observable o, Object arg) {
    this.state = ((com.coderbean.observer2.ConcreteSubject)o).getState();
}

}

- Client
```java
package com.coderbean.observer2;


/**
 * Created by Chang on 15/10/5.
 */
public class Client {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();

        ObserverA observerA = new ObserverA();
        ObserverA observerA1 = new ObserverA();
        ObserverA observerA2 = new ObserverA();


        subject.addObserver(observerA);
        subject.addObserver(observerA1);
        subject.addObserver(observerA2);;

        subject.setState(2000);

        System.out.println(observerA.getState());
        System.out.println(observerA1.getState());
        System.out.println(observerA2.getState());
    }
}
【2026最新版】PCL点云处理算法汇总(C++长期更新版) PCL学习目录。博客长期更新,最近一次更新时间为:2026年10月4日。 阅读详情

相关推荐

概率论 知识图谱 + 实战案例解析

本文通过构建概率论知识图谱,系统梳理了从随机试验、概率、条件概率到随机变量与分布的核心概念及其内在联系。结合朴素贝叶斯分类器和蒙特卡洛模拟等实战案例,深入解析了条件概率、独立性及大数定律等理论如何应用于机器学习与实际问题求解,旨在帮助读者建立结构化思维,将理论有效转化为解决实际问题的能力。

weixin_29051193的博客 266

GOF23设计模式之观察者模式(observer)

一、观察者模式概述   观察者模式主要用于 1 :N 的通知。当一个对象(目标对象 Subject 或 Observable)的状态变化时,它需要通知一系列对象(观察者对象 Observer),令它们做出响应。   通知观察者的方式:     (1)推        每次都会把通知以广播的方式发送给所有观察者,所有观察者只能被动接收。     (2)拉        观察...

dcpvpf6917的博客 202

【微信小程序开发与设计】垃圾智能分类小程序

垃圾分类是将来生活可持续发展的必需项。但是很多人由于缺乏垃圾分类知识,或是因为垃圾分类困难,费时费力,所以没有好好贯彻垃圾分类政策,此时设计一款方便于群众进行智能化垃圾识别分类的微信小程序就显得尤为必要。

Markelle_Fultz的博客 8243

笔记:Gof设计模式--Observer

1、意图   Define a one-to-many dependency between objects so that when oneobject changes state, all its dependents are notified and updatedautomatically. 2、适应性   Use the Observer pattern in any of t

liujundykx的专栏 406

【计算机视觉】基于复杂环境下的车牌识别

本文针对复杂环境下(光照变化、车牌变形、噪声干扰)的车牌识别问题,提出了一套完整的优化方案。通过四个核心环节进行改进:1)采用CLAHE、同态滤波等技术优化光照处理;2)使用边缘检测和透视变换应对车牌变形;3)结合中值滤波和暗通道去噪算法消除干扰;4)改进字符分割与识别方法。文章提供了详细的Python实现代码,展示了从预处理到字符识别的完整流程,并通过多策略融合显著提升了复杂场景下的识别准确率。实验结果表明,该方法能有效应对各类复杂环境挑战,为实际应用提供了可靠解决方案。

2401_84149564的博客 1625

AI Agent开发实战:100个真实场景题库解析

AI Agent开发涉及复杂的需求理解、架构设计及安全防护等关键技术环节。在工程实践中,开发者常面临需求偏差、系统崩溃等挑战,特别是在金融、医疗等高要求场景下。通过真实案例题库,开发者能系统性地掌握需求分析、架构决策树建模(如向量数据库选型)、安全攻防策略(如提示词注入防御)等核心技能。这些实战经验不仅能提升Agent的可用性和安全性,还能优化其在电商客服、智能家居等场景中的表现。题库采用动态难度系统,覆盖从基础到高级的开发挑战,是AI工程化落地的重要参考。

weixin_29057695的博客 342

8.5 GOF设计模式四: 观察者模式Observer

GOF设计模式四: 观察者模式Observer    现实中遇到的问题    当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式    观察者模式 Observer     定义对象之间的一对多依赖关系,当一个对象改变状态时,所 有依赖于它的对象都会自动获得通知       Define a one-to-m...

baoaiqiang8202的博客 237

高通8155车机系统里,安卓和QNX是怎么‘打电话’的?聊聊HAB通信框架那些事

本文深入解析了高通8155车机系统中HAB通信框架如何实现安卓与QNX的高效协同。作为异构系统的通信桥梁,HAB通过共享内存和中断信号机制,在多媒体数据传输中展现出零拷贝、硬件加速等优势,成为智能座舱实现实时性与生态丰富性平衡的关键技术。

weixin_42715608的博客 381

设计模式之GOF23的Observer

说明:观察者执行观察行为,添加被观察对象到观察列表中。   案1:   利用JDK的类:   package hiya.observer.jdk;   import java.util.Observable;   import java.util.Observer;   // this is a subject(观察者:执行观察行为的人)

风景依稀是去年 320

Perplexity SPACE沙箱平台:安全AI开发环境实战解析

沙箱技术通过资源隔离和权限控制创建受限执行环境,其核心原理是容器化隔离机制。在AI开发领域,这种技术解决了环境配置复杂性和安全风险等关键问题。SPACE沙箱平台作为AI代码执行环境,提供了标准化的开发沙箱,支持Python生态和主流AI框架。通过实战案例展示,该平台特别适用于情感分析等NLP任务的快速原型验证,帮助开发者在安全隔离的环境中测试AI模型和算法,显著提升开发效率并降低系统风险。

weixin_29029995的博客 274

【FLINK+Kerberos+kafka】在华为云上 bootstrap.server使用IP的GSS initiate failed 问题处理

目前互联网上所有的资料显示都是说没有正确设置KDC之类的,但本博主实际通过java代码低版本 如使用kafka-client 0.11.0 ,2.4.0等版本手动创建kafkaconfig 或者使用华为云的LoginUtils类 都能够正常链接,所以应该是高版本添加了相关配置,或者flink在subtask 创建kafkaAdminClient时 丢弃或使用了默认的一些配置行为,导致了客户端和kdc验证之间出现了principal 不一致导致验证失败。client.dns.lookup配置项作用。

honghanyue1791的博客 574

GOF23式——Observer

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

计算机技术交流 195

JavaSwing_4.2: JDialog、JOptionPane(对话框)

JDialog,对话框。使用 JDialog 类可以创建自定义有的对话框,或者调用 JOptionPane 中的多个静态方法快速创建各种标准的对话框。JOptionPane是 JavaSwing 内部已实现好的,以静态方法的形式提供调用,能够快速方便的弹出要求用户提供值或向其发出通知的标准对话框。

谢TS的博客 7万+

GOF23设计模式-行为型模式9-观察者模式(Observer)

观察者模式:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。又叫做发布-订阅(Publish-Subscribe)模式。

Tumbler 291

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

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++设计模式(GOF-23)——03 C++观察者模式(Observer / Event、发布-订阅模式、事件模式)

观察者模式(Observer Pattern)是一种行为型设计模式,用于建立对象间的一对多依赖关系。当一个对象(被观察者)状态发生变化时,所有依赖它的对象(观察者)都会自动收到通知并更新。这种模式通过解耦通知方与接收方,实现了系统的灵活性和可扩展性。特性传统实现观察者模式对象耦合度高低扩展性需修改现有代码支持开闭原则维护成本高低通知灵活性固定调用动态注册/注销适用场景复杂度简单场景复杂系统架构观察者模式通过接口抽象和行为封装,为复杂系统提供了优雅的通信解决方案。

Dontla的博客 1467

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

小米一面:说说MVC和设计模式的关系

先来看看面试环节吧。面试官:请说说MVC模式是基于哪种设计模式的?求职者:MVC本身不就是一种设计模式吗?面试官:我的意思是,MVC是基于23中设计模式中的哪一种?求职者:难道MVC不是那23种当中的?面试官:…………好吧,这种情况下,大概率是求职者对设计模式的学习比较少,就连我这种没正经学过设计模式的混子,也知道23种设计模式当中没有MVC。

m0_50180963的博客 227

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java_252_GOF23设计模式_观察者模式_obserable类和observer接口_应用场景总结_练习

观察者模式observer Observable是一个类 ;Observer是个接口 //--------------------目标对象类---------------- package java_252_GOF23设计模式_观察者模式_obserable类和observer接口_应用场景总结_练习; import java.util.Observable; /** *主题类 */ //目标对象;Observable是java提供的类; public class ConcreteSubject exte

weixin_45339692的博客 150

实践GoF的23种设计模式:观察者模式

现在有2个服务,ServiceA和ServiceB,通过REST接口通信;ServiceA在某个业务场景下调用ServiceB的接口完成一个计算密集型任务,假设接口为http该任务运行时间很长,但ServiceA不想一直阻塞在接口调用上。为了满足ServiceA的要求,通常有2种方案1、ServiceA隔一段时间调用一次ServiceB的接口,如果任务还没完成,就返回HTTPStatus102Processing;,GoF对它的定义如下。...

JAVAQXQ的博客 185

Java观察者模式(Observer)

  观察者模式java GOF23种设计模式中的一种。在最近介绍的Redis和ActiveMQ中都涉及到了观察者模式,所以我们在本文详细介绍下此模式: 观察者模式   观察者模式又称为发布/订阅(Publish/Subscribe)模式,在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新. 使用场景 广播机制场景 1.聊天室程序的创建。服务器创建好后,...

波波烤鸭的博客 1万+

Java 中的 23 种设计模式详解

项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

微笑听雨 7万+

设计模式 - C++ - Observer模式

设计模式 - C++ - Observer模式

trojanpizza的专栏 4838

分与合:重新读懂 GoF 23 种设计模式

本文从"分与合"的视角重新解读GoF 23种设计模式。软件设计中,"分"用于解耦和隔离变化,"合"旨在统一入口和复用资源。设计模式可分为三类:11个"分"模式(如Bridge分离抽象与实现、Strategy分派算法),7个"合"模式(如Singleton归并实例、Facade统一接口),以及5个"分合一体"模式(如Composite同时实现分解与组合)。这种分类方式揭示了设计模式的本质思想:在适当层面进行分离或组合,以平衡灵活性与复杂性。文章通过清晰图表和典型示例,展示了每种模式如何体现分合原则。

d3y1`5 81_09 618

GOF23设计模式之观察者模式

观察者模式,适用与服务器和客户端这类场景。

开心杨的个人博客 510

设计模式之GOF23观察者模式

观察者模式Observer 广播机制 场景:多个观察者--被通知改变 CS的时候,人物移动坐标变化,更新每个人地图上的坐标 核心:当目标对象(Subject)的状态值改变时,需要及时告知所有观察者(Observer),使他们做出响应 开发中常见的场景: -聊天室程序中,服务器转发给所有客户端 -网络游戏(多人联机)中,...

qq_44711190的博客 159

GOF设计模式

设计模式的使用: 首先,设计模式有其应用的场合,不相宜的场合乱用设计模式有害无益;其次,设计模式主要解决对象之间相互通信、 相互依赖的结构关系。 在描述一个设计模式时,至少需要包含四个方面:模式名称(Pattern name)、问题(Problem)、解决方案(Solution)、效果(Consequence)。 设计模式要有自己的名称。 设计模式的目的就是解决问题。 ...

程序员杂谈 7757

【C#设计模式】16.观察者模式(Observer Pattern)【行为型】

1.1 动机(Motivate) 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。 1.2 意图(Intent) 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。       ——《设计模式》GoF

星Yeah 的博客 3286
上一篇: GOF 23 设计模式之 状态模式
下一篇: GOF 23 设计模式之 备忘录模式(Memento)
coderbean
博客等级 码龄11年 12粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值