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

【愚公系列】二十三种设计模式(十九)-观察者模式(Observer Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情

 

  我们通常在同一时间将我们的数据表示为各种不同的形式,比如列表、图形等等。

我们也同样希望当数据改变时,将这个更新信息很方便的通知所有依赖于它的各个对象。

      例如:我们可以使用图形、表格或者列表框显示股票的价格,当股票的价格发生改变时,我们期望同时很方便的更改其它部分。

在这种情况下我们就可以使用Observer模式。我们可以很容易的利用Observer模式使我们的程序可以很方便的解决上面的问题。

结构图:

观察者模式假定保存数据的对象和显示数据的对象是分开的,负责显示数据的对象观察数据对象中的改变。(如图)                                                                            

  

 

 

 

当我们要实现Observer模式时,通常将数据对象作为目标(Subject),各个显示数据的对象作为观察者(Observer)。每一个观察者(Observer)通过调用目标(Subject)中的一个公有(public)方法,在他所感兴趣的数据中注册(registers)自己。这样,当数据改变时,每一个目标(Subject)通过观察者(Observer)的接口发送更新通知。

我们定义以下两个接口:

'Observer.vb

'定义Observer接口

Public Interface Observer

    Sub sendNotify(ByVal mesg As String) '用于发送更新通知

End Interface

 

Subject.vb

'定义Subject接口

Public Interface Subject

    Sub registerInterest(ByVal obs As observer) '用于注册观察者

End Interface

我们可以写一个简单的程序,以便更好的理解(Observer)观察者模式.。第一个窗体—主窗体,它有3个Radio Button,名称为Red, Blue and Green。

我们这个主窗体类实现Subject接口,这就意味着它必须提供公有方法registerInterest,用于注册(observer)观察者。

     Public Sub registerInterest(ByVal obs As VBNetObserver.Observer) Implements VBNetObserver.Subject.registerInterest

        observers.Add (obs)

    End Sub

 

       我们建立两个observer(观察者),一个显示颜色,另一个在一个list box中增加颜色。我们在主窗体类中显示他们。

        Dim lscol As New listObs(Me)

        lscol.Show ()

        Dim frcol As New ColFrame(Me)

        Frcol.Show()

第一个观察者(Observer)--------- ColorFrame,它实现Observer接口,下面是部分主要代码。

'Class ColorFrame

Public Class ColFrame

    Inherits System.Windows.Forms.Form

    Implements Observer             ‘实现Observer接口

    Private colname As String

    Dim fnt As Font

    Dim bBrush As SolidBrush

    '构造函数

    Public Sub New(ByVal subj As Subject)

        MyBase.New()

        subj.registerInterest(Me)  ‘注册Observer

        ColFrame = Me

        InitializeComponent()

        fnt = New Font("arial", 18, Drawing.FontStyle.Bold)

        bBrush = New SolidBrush(Color.Black)

        AddHandler Pic.Paint, New Forms.PaintEventHandler(AddressOf paintHandler)

    End Sub

 

        Public Shadows Sub Dispose()

        MyBase.Dispose()

        components.Dispose()

    End Sub

   '----

    Public Sub sendNotify(ByVal mesg As System.String) Implements VBNetObserver.Observer.sendNotify

        colname = mesg

        Select Case mesg.ToLower

            Case "red"

                Pic.BackColor = Color.Red '

            Case "blue"

                Pic.BackColor = Color.Blue

            Case "green"

                Pic.BackColor = Color.Green

        End Select

End Sub   

   End Class

我们的listbox窗体也是一个observer观察者,它将颜色加到列表中。下面是部分主要代码。

public Class listObs

    Inherits System.Windows.Forms.Form

    Implements Observer

    Public Sub New(ByVal subj As Subject)

        MyBase.New()      

        listObs = Me

        InitializeComponent()

        subj.registerInterest(Me)

    End Sub

    '-----

    Public Shadows Sub Dispose()

        MyBase.Dispose()

        components.Dispose()

    End Sub

    '-----

    Public Sub sendNotify(ByVal mesg As System.String) Implements Observer.sendNotify

        lscolors.Items.Add(mesg)

    End Sub

End Class

 

      在我们的程序中,点击主窗体中的任意一个radio button,它将调用每个注册过的Observer(观察者)的sendNotify方法。

      运行的效果为:

 

 

参考资料:

设计模式:利用C#的Delegate来改进Observer模式 作者:卢彦
探究观察者设计模式

        刚开始学习设计模式在.NET中的应用,希望对大家在学习过程中有所帮助!

可以写信给我进行交流!

Arduino-CRSF库详解:嵌入式端CRSF协议解析与ELRS接收机集成 CRSF(Crossfire Serial Protocol)是一种面向FPV无人机的轻量级、高实时性串行通信协议,采用单总线异步传输与8位CRC-8校验机制,广泛应用于遥控链路与遥测交互。其核心在于帧同步(0xC8起始字节)、反相逻辑电平及无重传的广播式设计,对嵌入式平台的UART精度、电平匹配和状态机健壮性提出严苛要求。Arduino-CRSF库正是为资源受限MCU(如ESP32、STM32、ATmega328P)提供零配置、中断安全的协议解析能力,封装了CRC查表计算、超时恢复、多级同步验证等关键机制 阅读详情

相关推荐

AI 代码赋能短视频带货:服装及多赛道批量内容生产全流程实操

本文聚焦 AI 技术在短视频带货领域的落地应用,以服装赛道为核心,延伸至花卉绿植、图书、茶具等热门领域,系统拆解 AI 工具在选品、素材处理、视频制作(含动态效果、场景搭建)、运营优化等环节的实操方法。针对从业者普遍面临的 “内容生产低效”“无专业技术难出优质视频”“流量运营踩坑” 等痛点,提供从基础工具使用到高阶视频制作的全流程技术方案,助力相关从业者借助 AI 实现批量、高效的短视频内容产出。

m0_67958922的博客 3083

设计模式之观察者模式

      一、观察者模式UML图 观察者模式:多个观察者同时监听同一个对象,如果该对象有变化,会通知所有的观察者对象。 例如:天气预报、公司通知放假等等   Observer 观察者接口,如果主题发生变更时,则更新状态 ObserverImpl:观察者的实现类,主题发生变化时,更新自己的状态   Subject:主题的父类,所有需要观察的主题应该继承这个类 Subjec...

张云生的博客 265

华为HCIA-Datacom实战:200人企业园区网从规划到部署全流程解析

本文详细解析了华为HCIA-Datacom认证实战中200人企业园区网的规划与部署全流程。从需求分析、组网架构设计到设备选型、VLAN划分及安全策略实施,全面覆盖园区网建设的关键环节,特别针对部门隔离、无线覆盖和基础安全防护等典型场景提供可落地的解决方案。

f0g1h2的博客 710

C# 观察者模式

在C#中,观察者模式通过定义一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。4. ConcreteObserver(具体观察者):具体的观察者,它继承或实现了观察者接口,并实现了更新方法。当接收到被观察者的通知时,它会执行相应的逻辑。3. ConcreteSubject(具体主题):具体的被观察者,它继承或实现了主题接口,并实现了具体的业务逻辑。1. Subject(主题):被观察者,它维护了一个观察者列表,并提供了添加、删除和通知观察者的方法。

熊思雨的博客 3363

【自然语言处理】【聚类】TELL:可解释神经聚类

超越分类的XAI:可解释神经聚类 《XAI Beyond Classification: Interpretable Neural Clustering》 论文地址:https://www.jmlr.org/papers/volume23/19-497/19-497.pdf 一、简介 ​ 本文研究了可解释AI(XAI\text{XAI}XAI)和数据聚类这两个挑战性问题。第一个问题是如何设计一种具有固定可解释性的神经网络,而不是给出一个黑盒模型的事后解释。第二个问题是,使用可微分神经网络来实现离散的k-me

bqw的博客 4137

三、STM32F103ZET6最小系统

stm32最小系统除去主控CPU外,需要包含,电源电路,复位电路,BOOT电路,时钟电路(因为stm32有内置时钟,对时钟要求不高的话,可以不要)。NRST引脚其实芯片已经用一个约40K的电阻上拉了,所以理论上来说是不需要再外接上拉电阻的,但我看大家都是有外接上拉的,心里没有底,不管这么多,先预留着。吃过亏,特意查看了芯片手册资料,下图是官方建议的供电方案,图片来自stm32f103zet6数据手册。首先明白目标,单纯的学习软件知识并不是我希望的,我还希望会硬件设计,这样后面才能摆脱开发板。

sevendecsdn的博客 6452

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

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

wesigj的博客 1482

k8s集群部署私有镜像仓库

本文介绍了在Kubernetes集群中部署私有镜像仓库的完整方案。使用registry:2镜像创建Deployment,通过NodePort(30500)暴露服务,并采用hostPath(/data/registry)实现数据持久化。部署过程包括节点标记、YAML配置、资源创建及验证步骤,同时提供了Docker和Containerd两种环境下的详细使用方法,包括配置不信任私有仓库、镜像推送/拉取操作指南。该方案特别适合开发测试环境,为团队提供便捷的本地镜像管理能力。

weixin_42728286的博客 893

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

UG\NX二次开发 替换部件引用集UF_ASSEM_replace_refset

替换部件引用集UF_ASSEM_replace_refset,需要替换成“完整部件(Entire Part)”需要第三个参数传入空指针或者空字符串。

王牌飞行员_里海的博客 255

如何使用tinyalas接口从usb录音的同时从扬声器播放

3、 以上步骤确认完后,就可以修改tinyhostless.c程序,tinyhostless的本质就是边pcm_read(),边pcm_write();但原本tinyhostless只支持对同一声卡进行操作,所有需要修改其代码,改成录音和播放可支持不同声卡,如果是模拟声卡,有回环测试,可以实现边录边播放,但涉及USB声卡时,就没有现场的类似功能,有时候客户因为硬件特殊性,会有从USB录音的同时从扬声器播放出来的需求,本文简要描述如何使用tinyalsa接口实现该需求;

sdrgtywretyeruet的专栏 971

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

本文结合代码详细地介绍了观察者模式的概念,适用场景,优缺点、实现方式,可以帮助读者更好地理解观察者模式

YUMIAloogy的博客~ 1268

【工程师一次性讲明白系列】什么是电压驻波比 (VSWR)

电压驻波比(VSWR)是电信号传输过程中非常重要的指标,控制VSWR的大小可以提高信号传输效率和系统稳定性。通过优化阻抗匹配,可以有效地减少反射信号,提升通信质量!🚀📡。

weixin_43199439的博客 1298

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

观察者模式是一种行为型设计模式,用于在对象间建立一对多的依赖关系。当主题对象状态改变时,所有依赖的观察者对象会自动收到通知并更新。该模式适用于事件处理、发布-订阅机制等场景,能实现松耦合的系统架构。典型结构包括Subject接口(定义添加/删除观察者方法)、Observer接口(定义更新方法)以及具体实现类。实现时,主题对象维护观察者列表,状态变化时遍历列表通知所有观察者。这种模式广泛应用于GUI事件处理、消息推送系统等需要实时数据更新的场景。

d3y1`5 81_09 956

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的观察者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

观察者模式(Observer Pattern)是其中一种非常流行的设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。本文将详细介绍观察者模式的概念、结构及其在C++中的实现。

J^T的博客 2386

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

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

Android常见设计模式——观察者模式 (Observer Pattern)

文章目录1. 前言2. 观察者模式2.1 源码2.2 结构3. Android中的观察者模式 1. 前言 观察者模式是在代码框架中使用比较高的一个设计模式,常常又叫做订阅/发布模式。而通过这个设计模式通常我们就可以做到代码的解耦。 在现实生活中,比如当我们订阅了Android官方资讯后,用户就可以收到来自这些网站的推荐消息。在这个场景中就是发布/订阅模式。而这种观察行为通常是一个被观察者,多个观察者。通过观察者模式可以实现一种一对多的关系,使得当被观察者的状态发生改变的时候,所有的观察者都可以得到通知,并作

梦否 3555

观察者模式(Observer Pattern)详解

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。观察者模式又被称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model-View)模式或源-监听器(Source-Listener)模式。观察者模式是一种强大且被广泛使用的设计模式,它允许对象之间进行松耦合的交互。通过将对象的依赖关系转换为松散耦合的观察者-主题关系,系统变得更加灵活和可维护。

yk_dflkg的博客 1939

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

观察者模式又叫做发布-订阅(Publish/Subscribe)模式,模型-视图( Model/View)模式、源-监听器( Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。

Elegance never goes out of fashion 3627

观察者模式(Observer Pattern)

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

ChineseSoftware的博客 3805

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

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

⚡ 578

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

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

遇见伯灵说的博客 1245

观察者模式(Observer Pattern)(一):观察者模式介绍

一、意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 二、适用性 《设计模式》中提到在以下任一情况下可以使用观察者模式: 1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 2.当对一个对象的改变需要同时改变

jialinqiang的专栏 5719

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

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

1161

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

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

星Yeah 的博客 3286

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

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

Meteors.的博客 1224
上一篇: Whidbey中客户端回调机制(一)
下一篇: 设计模式之观察者模式(Observer Pattern)(二)
guoyan19811021
博客等级 码龄24年 5粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值