观察者模式

马年祝福语创作指南:从经典句式到分场景实操与避坑清单 祝福语是人际沟通中极具社交意义的内容形式,一句恰到好处的吉祥话往往比长篇大论更能传递心意。围绕“马年祝福”这一场景,从生肖文化中“马”所代表的进取意象切入,解析“马年大吉、万事如意、心想事成”为何成为经久不衰的经典组合。通过拆解其逻辑层次与应用场景,提供一套面向不同关系对象的祝福语写作框架,并结合实战经验总结常见误区与避坑指南,帮助读者在春节祝福中实现更精准、更有温度的表达。无论是商务往来还是亲友互动,掌握这套方法都能让祝福语不止于套话,而是成为关系升温的催化剂。 阅读详情
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象。在刚才的例子中,业务数据是被观察对象,用户界面是观察者。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。如果在用户界面、业务数据之间使用这样的观察过程,可以确保界面和数据之间划清界限,假定应用程序的需求发生变化,需要修改界面的表现,只需要重新构建一个用户界面,业务数据不需要发生变化。

“观察”不是“直接调用”

实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,都不应该直接调用。

实现观察者模式的例子

实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——撤销注册”的形式。下面的三个图详细的描述了这样一种过程:

1:观察者(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。



2:被观察对象发生了某种变化(如图中的AskPriceChanged),从容器中得到所有注册过的观察者,将变化通知观察者。



3:观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。



观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。

下面代码是使用C#实现观察者模式的例子:

//“观察者”接口
public interface IObserver {
void Notify(object anObject);
}

//“被观察对象”接口
public interface IObservable {
void Register(IObserver anObserver);
void UnRegister(IObserver anObserver);
}

观察者和被观察对象都分别从这两个接口实现,所有的操作都是由这两个接口定义的,而不是具体的实现。所以观察者和被观察对象没有绑定在一起。我们可以方便的更改观察者和被观察对象的任意部分而不影响其他部分。

下面实现具体的被观察对象。下面的类是所有被观察对象的基类,实现了所有被观察对象都必须的方法。我们使用一个Hashtable作为观察者的容器。代码如下:

//所有被观察对象的基类
public class ObservableImpl : IObservable {

//保存观察对象的容器
protected Hashtable _observerContainer = new Hashtable();

//注册观察者
public void Register(IObserver anObserver){
_observerContainer.Add(anObserver,anObserver);
}

//撤销注册
public void UnRegister(IObserver anObserver){
_observerContainer.Remove(anObserver);
}

//将事件通知观察者
public void NotifyObservers(object anObject) {
//枚举容器中的观察者,将事件一一通知给他们
foreach(IObserver anObserver in _observerContainer.Keys) {
anObserver.Notify(anObject);
}
}
}

上面的类不是最终要实现的被观察对象,而是所有被观察者的基类,其中实现了所有观察对象共有的功能。这个类可以干脆定义为abstract,使得程序员不可以创建其实例。接口以及实现这个接口的虚类既保持了类之间松散的耦合,又使多个具体实现可以使用相同的功能。

下面最终实现观察者模式,使用用户界面——业务数据作为例子:

//业务数据(被观察对象)
public class SomeData : ObservableImpl {
//被观察者中的数据
float _askPrice;

//改变数据的属性
public float AskPrice {
set {
_askPrice = value;
base.NotifyObservers(_askPrice);//将改变的消息通知观察者
}
}
}
//用户界面(观察者)
public class SomeKindOfUI : IObserver {
public void Notify(object anObject){
Console.WriteLine("The new ask price is:" + anObject);
}
}

//实际调用的过程
public class MainClass{
public static void Main() {
//创建观察者和被观察者
SomeKindOfUI ui = new SomeKindOfUI();
SomeData data = new SomeData();

//在被观察对象中注册观察者
data.Register(ui);

//改变被观察对象中的数据,这时被观察者会通知观察者
data.AskPrice = 1000f;

//注销观察者,停止观察
stock.UnRegister(stockDisplay);
}
}


.NET中更好的实现方式

上面的形式是我们用一种最基本的方式实现了观察者模式,我们为观察者模式开发了一种特定的类型。在.NET框架中,使用代理以及事件,可以更好的实现观察者模式。C#中代理和事件的介绍可以看这一篇文章:在C#中使用代理的方式触发事件,里面有对代理和事件的详细描述,还有例程,这里就不多说了。在.NET支持的其他语言中也有各自的实现方式。

在事件的模式下,声明事件的类就是被观察者。被观察者不需要实现对观察者的注册,只需要公开一个事件,而不实行任何操作。被观察者也不需要将自己注册到观察对象中,而是要创建一个特定的代理的实例,将这个代理绑定到某个方法上。用这样的方式注册或者撤销观察者对观察对象的观察。仔细研究代理和事件的模式就不难发现,IObserver和IObservable接口的方法可以减少观察者和观察对象之间的耦合,而代理和事件几乎消除了这两个模块之间的耦合,灵活性提高了很多。
Cursor Agent模式下如何优雅切换conda环境运行Python脚本?3种实用方法实测 本文针对Cursor Agent模式下运行Python脚本时环境错配的痛点,实测了三种优雅切换conda环境的实用方法。通过Shell全局配置、项目级.cursorrc文件定制以及对话中直接指令,开发者可以确保AI助手在正确的虚拟环境中执行代码,从而提升开发效率和协作流畅度。 阅读详情

相关推荐

基于JavaEE的银行大客户关系维护系统(JSP+java+springmvc+mysql+MyBatis)

基于JavaEE技术的大型银行客户关系管理系统可以实现客户信息的集中管理、客户需求的分析与挖掘、个性化的服务推荐等功能。+ Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。用户发送请求:用户通过浏览器或其他客户端向系统发送请求,请求访问特定的页面或执行特定的操作。前端展示结果:前端接收到后端返回的数据,根据需要进行展示。数据返回给前端:后端程序处理完业务逻辑后,将结果数据返回给前端。后端程序接收到请求后,根据请求的类型和参数进行相应的处理。

gp1052的博客 719

.NET中的设计模式五:观察者模式

观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。观察者模式有很多实现方式

1735

Spring AI RAG 生产级实战:从 0 构建企业智能知识库系统

Spring AI🎯统一的 API 抽象:屏蔽不同 AI 服务商的差异🎯开箱即用的集成:支持主流大模型和向量数据库🎯Spring 生态融合:与 Spring Boot、Spring Data 无缝集成🎯企业级特性:事务管理、监控、安全等RAG 架构:检索 + 增强 + 生成,解决 LLM 局限性Spring AI:统一的 API 抽象,简化 AI 应用开发向量数据库:pgvector 适合中小规模,Milvus 适合大规模文档处理:加载 → 分块 → 向量化 → 存储检索优化。

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 408

C# 观察者模式

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

熊思雨的博客 3363

新手必看:CiscoPacket Tracer从零搭建局域网(含ARP协议详解)

本文为网络新手提供了一份使用Cisco Packet Tracer从零搭建局域网的详细指南。通过构建基础网络拓扑、配置IP地址,并深入剖析ARP协议的工作原理,帮助读者理解IP地址与MAC地址的映射关系,掌握局域网通信的核心机制。

weixin_29275257的博客 204

BUCK-BOOST升降压电路Multisim电路仿真分析

本文分析了三极管型BUCK-BOOST升降压开关电源的工作原理。该电路结合了BUCK降压和BOOST升压拓扑,通过控制三极管Q1的高频通断,使电感L1周期性储能和释能,实现输出电压可高于或低于输入电压且极性相反。详细阐述了Q1导通和关断阶段的工作过程,推导了输出电压与占空比的关系式Vo=-D/(1-D)*Vi,并分析了不同占空比下的工作模式(降压、升压)。通过Multisim仿真验证了理论分析,当D=25%时输出降压至1.6V,D=60%时输出升压至7.5V。电路具有升降压灵活、极性反转、效率高等特点,适用

XU157303764的博客 1436

C#的观察者模式

C#观察者模式使用(一)

weixin_47153140的博客 2223

提示工程从初级到高级:如何评估提示词的鲁棒性?架构师分享测试方法

鲁棒性(Robustness)原本是工程领域的概念,指系统在“非理想条件”下保持性能稳定的能力。输入鲁棒性:面对不规范、有噪音、格式变异的用户输入,提示能否引导模型输出正确结果?模型鲁棒性:同一提示在不同大模型(或同一模型的不同版本)下,输出是否一致?场景鲁棒性:在边界场景(极端case、歧义case、多任务混合)下,提示能否保持逻辑一致性?提示词V1:请将以下用户评论分类为「正面」「中性」或「负面」:{comment}。要求:输出唯一类别,不要额外说明。

小程序开发 496

《观察者模式》

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 观察者模式(Observer)完美的将观察者

li1060849458的博客 302

将 SAP BTP ABAP environment 与 SAP S/4HANA Cloud 公有云版集成:从架构理念到落地实战

本文探讨了在SAP云环境中实现ABAP扩展应用与S/4HANA Cloud系统集成的技术方案。通过建立标准化的远程通信通道,开发者可在SAP BTP ABAP环境中开发扩展应用,同时安全访问S/4HANA Cloud的核心业务数据和服务。文章详细介绍了整体架构设计、开发实现步骤(包括定义通信场景、生成服务消费模型和编写调用代码)以及管理员在S/4HANA侧的配置工作(创建通信安排和技术用户)。通过一个业务伙伴自助注册平台的案例,展示了如何在不修改标准系统的情况下实现云扩展,体现了SAP"干净核心&

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

UG NX二次开发(C#)-VS2022配置NX二次开发模板不能正常显示的问题

随着VS2022的发布,使用VS2022进行UG NX二次开发的人员也会越来越多,但是由于VS2022和以前的VS版本采用代码结构不同,而UG NX的二次开发编程模板还没有适应于VS2022的模板配置,所以不能正常的创建一个完整的工程。本文采用曲线救国的方式来实现VS2022下的UG NX二次开发。如果有读者能很好的解决模板配置,不吝赐教。

GimiGimmy 4275

大年初一领红包,恭喜发财,大吉大利

今天就是牛年大年初一了,这里给大家拜年了:新年进步,恭喜发财,一帆风顺,身体健康,事事如意,龙马精神,如意吉祥,大吉大利。祝福语来自电影《甜蜜蜜》,我觉得挺好的,欢迎转发视频号到朋友圈。公...

sushengbuhuo的博客 313

【基于深度学习的脑电图识别】数据集篇:THE TUH EEG CORPUS: A Big Data Resource for Automated EEG Interpretation

【基于机器学习的脑电图识别】数据集篇:脑电信号自动判读的大数据摘要: 摘要: 这个数据集包括超过 25000 个脑电图研究,包括一个神经学家对测试的解释,一个简短的病人病史和关于病人的人口统计信息,如性别和年龄。这是第一次有足够的数据来支持最先进的机器学习算法的应用。在这篇论文中,我们使用了3762个语料库的会话子集,展示了从原始脑电图信号数据预测脑电图的一些基本属性的初步实验结果。在闭环测试中,...

梁瑛平的博客 5615

元旦英语祝福语-恭喜发财(十四)

http://www.jufengshang.com/yuandan_v--i-2303 您所在的位置 : 元旦祝福语 -> 元旦英语祝福语 -> 元旦英语祝福语-恭喜发财(十四) 元旦英语祝福语-恭喜发财(十四) 1.生意兴隆:wish your business success 2.大吉大利:wish you good fortune and every s

我用CV我自豪。 1298

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

乙巳马年春联生成终端入门必看:马年专属意象词库构建方法

本文介绍了如何在星图GPU平台上自动化部署“乙巳马年·皇城大门春联生成终端W”镜像,快速搭建AI春联创作环境。该工具基于精心构建的马年专属意象词库,能够根据用户输入的关键词,智能生成对仗工整、富有文化底蕴的春节对联,并呈现于威严的皇城大门视觉界面,为新春佳节增添独特的数字仪式感。

weixin_36296444的博客 276

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

With best wishes for a happy New Year!

With very best wishes for your happiness in the New Year! 生意兴隆: wish your business success大吉大利: wish you good fortune and every success龙马精神: may you be as energetic as a dragon and a horse恭喜发财:

李蓝箫 8096

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

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

c#设计模式——观察者模式

前言: 观察者模式适用于一对一,或者一对多的情况,改变目标的状态可以同时让一个或者多个观察者看到目标的改变状态,然后根据自身情况作出相应的反应 class TempEventArgs:EventArgs { public double Temp { get; set; } public TempEventArgs (double temp) { this.Temp = temp; } } c

qq_34059233的博客 1778

C#设计模式之---观察者模式

观察者模式(Observer Pattern)是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主体是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互、权限管理等方面也有广泛的应用。观察者模式的主要的作用就是对对象解耦,将观察者和被观察者完全隔离。2)事件委托方式实现。1)面向对象方式实现。

风清扬的专栏 1612

C#:设计模式:观察者模式

被观察者的状态发生了改变之后需要通知观察者做出相应的动作,比如在游戏中当我们点击了一个开始按钮,就需要加载音乐、场景等,这里的按钮就是被观察者,场景和音乐管理器就是观察者。观察者:相当于事件的订阅者(事件对应具体方法实现),它会观察被监视对象的某些属性,当这些属性发生变化时,会触发观察者做出对应的反应。加热水的加热器,时刻显示水温的显示器,当水温达到90度时的报警器。被观察者:相当于事件发布者(定义事件,触发事件),其中有一些属性来被其它对象所监视。思路:这题猫是被观察者,老鼠、主人、宝宝都是观察者。

ypcyyds_的博客 455

C#——观察者模式

首先了解一下委托和事件 什么是委托 委托是方法的代理,委托的是方法,当调用委托时就是调用了这个方法。 委托是一类行为的抽象。是方法的引用,是一种数据类型。 1>委托关键字 delegate :字面意思 委托,代理 生活中【中介,经纪人】 2>计算机中的委托的定义: 委托是一种数据类型,委托代表的是方法, 当调用委托时就是调用了这个方法。 方便理解: 委托是一种{声明了返回类型和参数组成的}数据类型 委托代表{表示,代理,委托}的是方法,{代表和委托签名一致的任何方法} 当调用委托时就是调用了这个

YJF19997的博客 2001

【行为型设计模式】C#设计模式之观察者模式

【代码】C#设计模式之观察者模式。

csdn2990的博客 1507

设计模式第5讲——观察者模式(Observer)

观察者模式属于行为型模式。一、什么是观察者模式 二、特点 三、组成 四、应用场景4.1 生活场景4.2 程序场景 五、观察者模式实现5.0 UML类图5.1 Newspaper5.2 NewspaperImpl5.3 Subscriber5.4 SubscriberImpl5.5 测试

让~学习~成为一种习惯(橡 皮 人の技术博客) 2万+

.NET高级面试指南专题十四【 观察者模式介绍,最常用的设计模式之一】

观察者模式(Observer Pattern)是一种行为型设计模式,其目的是定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。

一个专注于技术研究创新的程序员 1529

C#观察者模式应用

C#观察者模式应用

cangqiongxiaoye的博客 1712

c#事件——观察者模式

c#委托事件的作用----观察者模式,发布订阅机制

qq_52397831的博客 862
上一篇: 命令模式
下一篇: 深入剖析C#的多态
playsation10
博客等级 码龄22年 0粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值