c#设计模式-行为型模式 之 观察者模式

定义:

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

在观察者模式中有如下角色:

  1. Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每 个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
  2. ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具 体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
  3. Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知 时更新自己。
  4. ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知 时更新自身的状态。

案例

这里案例使用一个委托进行多播来进行对热水器的观察

加热器类

首先定义一个全局变量,温度temperature,然后使用event声明一个事件,委托名称使用无返回值的Action,参数为int。然后写一个for循环模拟烧水,温度temperature大于95时,执行事件。

public class HeaterSubject
{
    private int _temperature;

    public event Action<int> OnBoilEvent;

    public void BoilWater()
    {
        for (int i = 0; i < 100; i++)
        {
            _temperature++;
            
            if (_temperature >= 95)
            {
                OnBoilEvent.Invoke(_temperature);//触发事件:发出警报,显示水温
            }
        }
    }
}

监视者

热水器上一般都有显示屏和警报器,这里模拟两个观察者,分别是显示器和警报器

因为上面声明的委托参数是int,这里的观察者参数也要匹配,等一下才可以通过多播的形式插入

public class DisPlayObserver
{
    /// <summary>
    /// 显示水温
    /// </summary>
    /// <param name="temperature"></param>
    public void Display(int temperature)
    {
        Console.WriteLine($"显示屏-当前温度是:{temperature}");
    }
}
public class AlertObserver
{
    /// <summary>
    /// 发出警报
    /// </summary>
    /// <param name="temperature"></param>
    public void MakeAlert(int temperature)
    {
        Console.WriteLine($"语音报警器-温度是{temperature}");
    }
}

main方法

在main方法中,实现new一个热水器的实例,然后使用多播将多个方法绑定到一个委托实例。当调用此类委托时,所有绑定的方法会被一次全部调用,最后调用热水器的烧水方法

    public static void Main(string[] args)
    {
        HeaterSubject subject = new HeaterSubject();
        //订阅发出警报
        subject.OnBoilEvent += new AlertObserver().MakeAlert;
        //订阅显示水温
        subject.OnBoilEvent += new DisPlayObserver().Display;
        
        subject.BoilWater();
    }

 多播的优缺点

  1. 优点: 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。 被观察者发送通知,所有注册的观察者都会收到信息【可以实现广播机制】
  2. 缺点: 如果观察者非常多的话,那么所有的观察者收到被观察者发送的通知会耗时 如果被观察者有循环依赖的话,那么被观察者发送通知会使观察者循环调用,会导致系统崩溃

 使用场景

  1. 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。
  2. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/70873.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Git进行项目版本控制

文章目录 1、什么是Git&#xff1f;2、安装Git3、Git汉化3.1 Git Bash汉化3.2 Git GUI汉化(了解) 4、快速上手Git基本命令5、Git是怎么运作的&#xff1f;6、工作区、暂存区、本地仓库、远程仓库的区别6.1 工作区6.2 暂存区6.3 本地仓库6.4 远程仓库6.4 总结 7、 Git具体工作流…

[QT编程系列-41]:Qt QML与Qt widget 深入比较,快速了解它们的区别和应用场合

目录 1. Qt QML与Qt widget之争 1.1 出现顺序 1.2 性能比较 1.3 应用应用领域 1.4 发展趋势 1.5 QT Creator兼容上述两种设计风格 2. 界面描述方式的差别 3. QML和Widgets之间的一些比较 4. 选择QML和Widgets之间的Qt技术时&#xff0c;可以考虑以下几个因素&#xff…

纯前端 -- html转pdf插件总结

一、html2canvasjsPDF&#xff08;文字会被截断&#xff09;&#xff1a; 将HTML元素呈现给添加到PDF中的画布对象&#xff0c;不能仅使用jsPDF&#xff0c;需要html2canvas或rasterizeHTML html2canvasjsPDF的具体使用链接 二、html2pdf&#xff08;内容显示不全文字会被截断…

Linux:Shell编程之正则表达式

目录 绪论 1、正则表达式 1.1 通配符 1.2 正则表达式分类 1.3 基本正则 1.4 正则表达式中表示次数的表达式 1.5 位置锚定 1.5.1 词首锚定和词尾锚定 1.6 分组&#xff08;&#xff09; 1.7 逻辑或 1.8 扩展正则 绪论 正则表达式&#xff1a;有一类特殊字符以及文本…

Apache Paimon 流式数据湖 V 0.4 与后续展望

摘要&#xff1a;本文整理自阿里云开源大数据表存储团队负责人、阿里巴巴高级技术专家&#xff0c;Apache Flink PMC&#xff0c;Paimon PPMC 李劲松&#xff08;之信&#xff09;在 Apache Paimon Meetup 的分享。本篇内容主要分为四个部分&#xff1a; 湖存储上的难点深入 Ap…

STM32 LL库+STM32CubeMX--LED呼吸灯

一、前期准备 硬件&#xff1a;STM32F103C8T6开发板调试工具&#xff1a;DAPLink(本次使用)或USB-TTL开发环境&#xff1a;STM32CubeMX、Keil、Vscode(可选)LED&#xff1a;使用PA0(TIM2_CH1)输出PWM&#xff0c;LED的阴极接GND 二、使用定时器中断产生PWM STM32F103C8T6在72…

图像的平移变换之c++实现(qt + 不调包)

1.基本原理 设dx为水平偏移量&#xff0c;dy为垂直偏移量&#xff0c;则平移变换的坐标映射关系为下公式&#xff0c;图像平移一般有两种方式。 1.不改变图像大小的平移&#xff08;一旦平移&#xff0c;相应内容被截掉&#xff09; 1&#xff09;当dx > width、dx < -wi…

《华为认证》L2TP VPN配置

配置接口ip地址&#xff0c;并且将防火墙的接口加入对应的安全区域 。 LNS的G1/0/0 IP为202.1.1.1 1、配置LNS的缺省路由&#xff1a; ip route-static 0.0.0.0 0.0.0.0 202.1.1.2 2、通过WEB 界面配置防火墙的 L2TP VPN 浏览器输入&#xff1a; https://202.1.1.1:8443/def…

【脚踢数据结构】深入理解栈

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言,Linux基础,ARM开发板&#xff0c;软件配置等领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff01;送给自己和读者的一句鸡汤&#x1f914;&…

群晖7.X版安装cpolar内网穿透

群晖7.X版安装cpolar内网穿透套件 文章目录 群晖7.X版安装cpolar内网穿透套件前言1. 下载cpolar的群晖系统套件1.1 在“套件中心” 选择“手动安装”1.2 完成套件安装 2. 进入cpolar软件信息页3. 点击“免费注册”轻松获得cpolar账号 前言 随着群晖系统的更新换代&#xff0c;…

taro Swiper组件--异形滚动

效果 <SwiperindicatorDots{false}previousMargin50pxnextMargin50pxautoplay{false}interval100onChange{onChangeSwiper} >{[1,2,3].map((item, index) > {return (<SwiperItemkey{item-${index}}><View className{demo-item ${currentIndex index ? ac…

功能上新|全新GPU性能优化方案

GPU优化迎来了全新的里程碑&#xff01;我们深知移动游戏对高品质画面的追求日益升温&#xff0c;因此UWA一直着眼于移动设备GPU性能优化&#xff0c;以确保您的游戏体验尽善尽美。然而&#xff0c;不同GPU芯片之间的性能差异及可能导致的GPU瓶颈问题&#xff0c;让优化工作变得…

sentinel---滑动窗口的实现原理

sentinel有多种规则&#xff0c;包括&#xff1a;降级、限流、热点等等规则&#xff0c;这些规则均会涉及到时间因素&#xff0c;既在单位时间内的请求量满足各种条件之后的各种动作。 这里我们一起来探针一下sentinel中滑动窗口的实现 如上是一个滑动窗口的示意图。 这里先不…

内生安全构建数据存储

一、数据安全成为防护核心&#xff0c;存储安全防护不容有失 1、数据作为企业的核心资产亟需重点保护&#xff0c;数据安全已成网络空间防护核心 2、国家高度重视关键信息基础设施的数据安全&#xff0c;存储安全已成为审核重点 二、存储安全是数据安全的关键一环&#xff0c;应…

腾讯云CVM服务器竞价实例是什么?和按量计费有什么区别?

腾讯云服务器CVM计费模式分为包年包月、按量计费和竞价实例&#xff0c;什么是竞价实例&#xff1f;竞价实例和按量付费相类似&#xff0c;优势是价格更划算&#xff0c;缺点是云服务器实例有被自动释放风险&#xff0c;腾讯云服务器网来详细说下什么是竞价实例&#xff1f;以及…

Electron + Vue3 + Vite + TS 构建桌面应用

之前是使用React、Electron、TS和webpack来构建桌面应用的。虽然功能齐全,但是打包等等开发的体验不太理想,总感觉太慢了。作为一个开发者,我们总是希望,执行构建命令后,可以快速打包或者启动本地应用,且通过更少的配置,来完成开发体验。 现在的vite已经得到广泛的应用…

16-3_Qt 5.9 C++开发指南_使用QStyle 设置界面外观_实现不同系统下的界面效果的匹配

文章目录 1. QStyle的作用&#xff08;实现不同系统下的界面效果的匹配&#xff09;2. Qt内置样式的使用3. 源码3.1 可视化UI设计3.2 mainwindow.cpp 1. QStyle的作用&#xff08;实现不同系统下的界面效果的匹配&#xff09; Qt 是一个跨平台的类库&#xff0c;相同的界面组件…

Kafka:springboot集成kafka收发消息

kafka环境搭建参考Kafka&#xff1a;安装和配置_moreCalm的博客-CSDN博客 1、springboot中引入kafka依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><…

机器学习深度学习——RNN的从零开始实现与简洁实现

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——循环神经网络RNN &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮…

TSINGSEE青犀视频安防监控视频平台EasyCVR设备在线,视频无法播放的原因排查

可支持国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等多种协议接入的安防监控视频平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、…