设计模式与实例代码:Observer模式

设计模式——学习笔记——观察者模式Observer——基础篇 Observer(观察者模式)是一个非常有意思的模式,在实际应用中非常的广泛,诸如时间监听模型,Tomcat中对组件生命周期的控制。同时Observer模式在一些场景下会与其他模式配合使用,如Adapter(适配器模式)、Strategy(策略模式)等。 由于Observer的使用非常的灵活,并鉴于本人目前的水平,简要的从以下几个方面介绍Observer: Observer的含义O 阅读详情

意图/定义:在对象间定义一种一对多的依赖关系,这样当一个对象的状态改变时,所有依赖者都将和到通知并自动更新

问题:当某个事情发生时,需要向一系列变化着的对象发出通知

解决方案:观者者将监视某个事件的责任委托给主题对象

参与者和协作者:Subject知道自己的Observer,因为Observer会向其注册。主题必须在所监视的事件发生通知观察者

效果:如果某些Observer只对事件的一个子集感兴趣,那么Subject可能会告诉它们所不需要知道的事件。如果Subject通知Observer,后者又请求更多信息,则需要进行额外通信。

实现:让某个事件发生需要知道的对象Observer将自己注册到另一个监视事件发生或自己触发事件的Subject对象上。事件发生时,Subject告诉Observer事件已经发生。为了对所有Observer类型的对象实现Obserer接口,有时需要用Adapter模式。


下面是一个在股票变化之后主动通知多个投资人的示例:

using System;
using System.Collections.Generic;

namespace Observer
{
    /// <summary>
    /// MainApp startup class for Real-World
    /// Observer Design Pattern.
    /// </summary>
    class MainApp
    {
        /// <summary>
        /// Entry point into console application.
        /// </summary>
        static void Main()
        {
            // Create IBM stock and attach investors
            IBM ibm = new IBM("IBM", 120.00);
            ibm.Attach(new Investor("Sorros"));
            ibm.Attach(new Investor("Berkshire"));

            // Fluctuating prices will notify investors
            ibm.Price = 120.10;
            ibm.Price = 121.00;
            ibm.Price = 120.50;
            ibm.Price = 120.75;

            // Wait for user
            Console.ReadKey();
        }
    }

    /// <summary>
    /// The 'Subject' abstract class
    /// </summary>
    abstract class Stock
    {
        private string _symbol;
        private double _price;
        private List<IInvestor> _investors = new List<IInvestor>();

        // Constructor
        public Stock(string symbol, double price)
        {
            this._symbol = symbol;
            this._price = price;
        }

        public void Attach(IInvestor investor)
        {
            _investors.Add(investor);
        }

        public void Detach(IInvestor investor)
        {
            _investors.Remove(investor);
        }

        public void Notify()
        {
            foreach (IInvestor investor in _investors)
            {
                investor.Update(this);
            }

            Console.WriteLine("");
        }

        // Gets or sets the price
        public double Price
        {
            get { return _price; }
            set
            {
                if (_price != value)
                {
                    _price = value;
                    Notify();
                }
            }
        }

        // Gets the symbol
        public string Symbol
        {
            get { return _symbol; }
        }
    }

    /// <summary>
    /// The 'ConcreteSubject' class
    /// </summary>
    class IBM : Stock
    {
        // Constructor
        public IBM(string symbol, double price)
            : base(symbol, price)
        {
        }
    }

    /// <summary>
    /// The 'Observer' interface
    /// </summary>
    interface IInvestor
    {
        void Update(Stock stock);
    }

    /// <summary>
    /// The 'ConcreteObserver' class
    /// </summary>
    class Investor : IInvestor
    {
        private string _name;
        private Stock _stock;

        // Constructor
        public Investor(string name)
        {
            this._name = name;
        }

        public void Update(Stock stock)
        {
            Console.WriteLine("Notified {0} of {1}'s " +
              "change to {2:C}", _name, stock.Symbol, stock.Price);
        }

        // Gets or sets the stock
        public Stock Stock
        {
            get { return _stock; }
            set { _stock = value; }
        }
    }
}




OpenHarmony 4.1/5.0 Beta上手:如何用ArkUI在非华为设备上开发你的第一个“鸿蒙”应用 本文详细介绍了如何在非华为设备上使用ArkUI开发OpenHarmony应用,涵盖从设备选型、环境搭建到应用部署的全流程。通过实战案例展示ArkTS语言在开源鸿蒙生态中的应用,帮助开发者突破设备限制,构建跨平台鸿蒙应用。 阅读详情

相关推荐

Frigate进阶玩法:如何用MQTT和Python脚本扩展你的自定义目标检测算法

本文详细介绍了如何通过MQTT和Python脚本扩展Frigate的自定义目标检测算法,无需修改源码即可实现特殊场景(如工业设备异常、农业病虫害识别)的高效检测。文章涵盖Frigate配置、外部检测服务构建、高级集成技巧及性能优化实践,帮助开发者灵活扩展智能监控能力。

weixin_42662293的博客 348

23种设计模式(附代码样例)

平常看的设计模式有很多,就强迫症的都总结起来。一、设计模式分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式...

MiaoTai 1万+

大话西游2单机版V8一键架设教程:5分钟搞定GM权限和仙玉修改(附完整物品代码表)

本文详细讲解了大话西游2单机版V8的一键架设教程,包括5分钟快速配置GM权限、仙玉修改及物品代码使用技巧。通过分步指导和服务端配置详解,帮助玩家轻松掌握游戏管理功能,重温经典回合制体验。附完整物品代码表,助你快速获取稀有道具和神兽。

weixin_42557830的博客 1227

设计模式:Observer(从java源代码看)

jdk6开放了源代码,很不错的事情。 今天终于有幸从源代码看了observer设计模式,发现这样远比苦读书强多了。 所谓observer模式:1. observable中注册observer2.observable中有啥需要其所有observer的知晓的,那么通知他们。 实现原理也很简单:1.把所有observer添加到observable得箱子(Vector)

regon的专栏 566

《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场

当数据具有资产属性之后,数据便可以直接或者间接地为公司、为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易。 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战,主要包括: 数据的质量、价格如何定义 在合法合规的前提下,数据的交易如何确保不会泄露用户的隐私 如何构建合理的激励机制来鼓励更多的参与方加入数据交易市场中 大数据交易 数据交易的定义 数据交易是指一种对数据进行买卖的行为,大数据交易由三方共同参与,分别为数据提供方、大数据交易平台和数据需求方:

IEEE802_11的博客 3432

解锁全志T113-i隐藏技能:用RISC-V核跑实时系统比STM32还稳?

本文深入探讨了全志T113-i SoC的异构架构潜力,重点解析如何利用其内置的玄铁C906 RISC-V核心独立运行实时系统。通过对比传统MCU与Linux方案,文章提供了从RISC-V核心启动、FreeRTOS移植到与Linux主核进行高效异构通信的完整实战指南,为工控等需要兼顾丰富应用与硬实时控制的场景提供了高集成度的单芯片解决方案。

ansible6ops的博客 494

C++设计模式之观察者模式(Observer pattern)

观察者模式: 为对象建立一种“通知依赖”关系,当一个对象(目标对象)的状态发生变化时,所有的依赖对象(观察者对象)都得到通知并自动更新。 观察者模式,又称发布-订阅模式,其所作的工作就是在解除耦合,弱化依赖关系,采用面向对象技术,让耦合的双方都依赖于抽象,而不是依赖于具体,将这二者封装在独立的对象中以使它们可以独立的改变和复用。 观察者模式中的四类角色: 1.Subject(目标):抽象的目标类,提供增加和删除观察者对象的的方法,以及一个抽象的Notify方法(通知机制),目标类可以是接口,也可以是抽象类和

weixin_43086349的博客 266

前沿探索:基于强化学习的目标检测与跟踪技术及论文解析

前沿探索:基于强化学习的目标检测与跟踪技术及论文解析 ,人工智能,计算机视觉,大模型,AI,本文聚焦基于强化学习的目标检测与跟踪技术,先介绍相关技术基础,包括目标检测、跟踪及强化学习的算法等。接着阐述强化学习在目标检测与跟踪中的应用思路、框架及典型算法,解析三篇相关论文的背景、方法、实验结果。还探讨了该技术面临的样本效率、奖励函数设计等挑战,以及结合迁移学习等的未来发展方向,为该领域研究提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 11万+

设计模式之命令模式(Command)摘录

设计模式之命令模式(Command)摘录!

网络资源是无限的 2736

2026年大数据开发工程师常见面试选择题

大数据面试高频考点解析 摘要:本文汇总了30道大数据开发面试高频题目,涵盖Hadoop生态、Spark、Flink、Kafka等核心组件。重点包括:1)HDFS架构与特性(5V特征、副本机制);2)MapReduce/Spark原理(Shuffle过程、RDD抽象);3)实时计算(Kafka消费组、Flink Watermark);4)数据仓库设计(分层模型、性能优化)。特别强调数据倾斜、小文件问题等实战场景的解决方案,以及从日志、资源等多维度排查任务异常的方法。掌握这些基础原理和典型问题应对策略,是应对大

不务正业的猿 450

18、未来医疗信息学中的太赫兹天线技术

本文探讨了太赫兹天线技术在医疗信息学中的关键作用,重点分析了分裂环谐振器和纳米结构光导天线(PCA)的设计与性能提升方法,介绍了相干与非相干太赫兹检测技术,并通过等效电路模型和数值模拟深入解析PCA工作机理。文章还展示了太赫兹技术在无创血糖监测、肿瘤检测等医疗诊断中的实验应用,总结了其非侵入性、高分辨率成像和多参数分析等优势,同时指出信号检测难、成本高和技术复杂等挑战。未来趋势包括设备小型化、效率提升及与人工智能融合,拓展至药物研发、皮肤与神经疾病诊断等领域,展现出变革医疗健康的巨大潜力。

milk8的博客 146

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

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

dcpvpf6917的博客 202

unity6000.0.3版本URP下ScriptableRendererFeature如何实现一张自定义贴图效果?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 584

Observer设计模式

Observer模式 一、Observer设计模式初步描述 1.1 问题 Observer模式应该可以说是应用最多、影响最广的模式之一,因为Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC实现了业务逻辑和表示层的解耦。个人也认为Observer模式是软件开发过程中必须要掌握和使用的模式之一。在MFC中,Do

勇敢无畏的活着 1225

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

Observer(观察者)是一种设计模式,一个对象(subject)维持一系列依赖于它(观察者)的对象,将任何状态的任何变更自动通知给它们。 Suject(目标) 维护一系列的观察者,方便添加或者删除观察者。 Observer(观察者) 为那些在目标状态发生改变时需获得通知的对象提供更新接口   首先,建立Observer所需要的代码 function ObserverList

vuturn的专栏 8279

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

XcodeSwiftSnippets中的设计模式应用:Singleton、Delegate与Observer模式

XcodeSwiftSnippets是一个专为Swift开发者打造的代码片段集合,提供了丰富的Swift 4代码模板,帮助开发者快速实现常见设计模式。本文将深入解析其中三种核心设计模式——Singleton(单例)、Delegate(委托)和Observer(观察者)的应用,以及如何通过这些代码片段提升iOS开发效率。 ## 如何使用XcodeSwiftSnippets快速实现设计模式 Xco

gitblog_00928的博客 481

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Observer模式】C++设计模式——观察者模式

C++观察者模式、Observer模式,用简单的举例分析、对比分析使用观察者模式的好处,总结观察者模式的要点

不负AC不负卿的博客 1465

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

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

trojanpizza的专栏 4838

[设计模式]Observer观察者模式

问题 Observer模式应该可以说是应用最多,影响最广的模式之一,因为Observer的一个实例Model/View/Control(MVC)结构在系统开发架构设计中有着很重要的地位和意义,MVC实现了业务逻辑和表示层的解耦。在MFC中,Doc/View(文档视图结构)提供了实现MVC的框架结构。还有在事件处理系统中也经常用到,事件分发机制就是采用的观察者模式。观察者模式是实现解耦的一种方法,...

超越 3039

设计模式17——Observer设计模式

Observer观察者设计模式用于将对象的变化通知给感兴趣的用户。在Observer模式中的角色为主题(subject)与观察者(observer),观察者订阅它感兴趣的主题,一个主题可以被多个观 察者订阅,当主题的状态发生变化时,它必须通知(notify)所有订阅它的观察者,观察者检视主题的状态变化,并作出对应的动作,所以Observer模式也称之为Publish-Subscribe模式。 Ob

Tony Chen的专栏 1656

Java设计模式之factory、abstract factory、proxy、observer、visitor、state、memento

Java设计模式之factory、abstract factory、proxy、observer、visitor、state、memento设计模式(二)1. Factory(工厂模式)1.1 目的1.2 使用方法1.3 工厂方法的优缺点2. Abstract Factory(抽象工厂模式)2.1 目的2.2 使用方法2.3 抽象工厂方法的优缺点3. Proxy(代理模式)3.1 目的3.2 使用方法3.3 代理模式的优缺点 更新中,待更新内容为observer、visitor、state、memento

qq_44013163的博客 923

设计模式(八)【Observer模式】

Observer模式 《设计模式》分类 分类 意图 例子 用途 创建型 创建或实例化对象 Abstract FactorySingletonDouble-Checked LockingFactory Method 实例化对象 结构型 将已有的对象组合起来 FacadeAdapterBridge 处理接口将实现与抽象联系起来 行为型 给出一种提供灵活(变化)行为的方式 Str...

xiaowei_innocence的博客 523

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

目录 角色组成 抽象主题(Subject) 具体主题(Concrete Subject) 抽象观察者(Observer) 具体观察者(Concrete Observer) 具体实现 总结 观...

徐小陌的博客 1790

设计模式之Observer

我们可能见过这样的一种设计:创建一个对象,每当用户所关心的对象某个方面发生变化的时候,该对象负责通知该用户,在受关注的对象的时候通知用户的时候,用户去查询该对象的新状态,这样的设计意图也就是Observer模式的设计意图。下面的代码能很清楚的说明Observer的设计意图: package test.spring;import java.util.ArrayList;imp

jellins的专栏 2531

设计模式(JAVA)——Observer模式

设计模式java之Observer模式,观察者模式。发布-订阅

读书 好学 求知 642
上一篇: 设计模式与实例代码:Bridge模式
下一篇: 设计模式与实例代码:Template Method模式
zzulp
博客等级 码龄19年 464粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值