C#设计模式之观察者模式
题目:假设你正在开发一个简单的新闻发布系统,该系统允许用户订阅不同的新闻频道,并在有新闻发布时向订阅者发送通知。使用观察者模式设计和实现该系统。观察者模式的相关概念和定义:
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,以便当一个对象的状态发生变化时,可以自动通知其他相关对象。在这种模式中,存在两种角色:主题(Subject):也称为被观察者或发布者,在观察者模式中起通知的作用。主题维护着一组观察者,并提供注册、注销和通知的方法。观察者(Observer):也称为订阅者或监听器,观察者通过注册到主题来接收通知并进行相应的处理。当主题的状态发生变化时,观察者将根据接收到的通知执行相应的操作。观察者模式的基本思想是主题与观察者之间是松耦合的关系,使得它们可以独立地变化,而不会互相影响。主题只需要维护观察者列表并通知它们即可,无需了解观察者具体的实现细节。在上述的新闻发布系统中,主题可以是一个新闻频道,观察者可以是用户订阅该频道的用户。当有新闻发布时,主题将通知所有相关观察者,并将新闻内容传递给它们。观察者接收到通知后可以根据需要进行相应的处理,比如显示通知、发送邮件等。通过观察者模式,我们可以实现松耦合的系统设计,使得主题和观察者可以独立地扩展和修改,从而提高代码的可维护性和可扩展性。同时,观察者模式也符合开闭原则,因为我们可以动态地添加或删除观察者,而无需修改主题的代码。
参考代码:
class Program
{static void Main(string[] args){NewsChannel channel = new NewsChannel();// 创建观察者对象IObserver subscriber1 = new Subscriber("订阅者1");IObserver subscriber2 = new Subscriber("订阅者2");IObserver subscriber3 = new Subscriber("订阅者3");// 注册观察者channel.RegisterObserver(subscriber1);channel.RegisterObserver(subscriber2);channel.RegisterObserver(subscriber3);// 发布新闻channel.PublishNews("今日头条:天气晴朗!");Console.WriteLine();// 取消订阅观察者channel.UnregisterObserver(subscriber2);// 发布新闻channel.PublishNews("特别新闻:重要通知!");}
}public interface ISubject
{void RegisterObserver(IObserver observer);void UnregisterObserver(IObserver observer);void NotifyObservers(string news);
}public interface IObserver
{void Update(string news);
}public class NewsChannel : ISubject
{private List<IObserver> _observers;private string lastNews;public NewsChannel(){_observers = new List<IObserver>();}public void NotifyObservers(string news){foreach (var observer in _observers){observer.Update(news);}}public void RegisterObserver(IObserver observer){_observers.Add(observer);}public void UnregisterObserver(IObserver observer){_observers.Remove(observer);}public void PublishNews(string news){lastNews = news;Console.WriteLine("新闻发布:" + news);NotifyObservers(news);}}public class Subscriber : IObserver
{private string _name;public Subscriber(string name ) {_name = name;}public void Update(string news){Console.WriteLine(_name + " 收到新闻:" + news);}}
相关文章:
C#设计模式之观察者模式
题目:假设你正在开发一个简单的新闻发布系统,该系统允许用户订阅不同的新闻频道,并在有新闻发布时向订阅者发送通知。使用观察者模式设计和实现该系统。观察者模式的相关概念和定义: 观察者模式是一种行为设计模式,它定…...
小红书攻略:爆款引流,如何在激烈竞争中脱颖而出?
小红书(RED)作为国内最具影响力的社交电商平台之一,是很多品牌运营者的首选之一。然而,在小红书的激烈竞争中,如何快速引流、吸引关注,成为了品牌运营者面临的挑战。本篇文章一秒推小编将为您介绍小红书运营…...
Ubuntu中的安装卸载及删除方法
说明:由于图形化界面方法(如Add/Remove... 和Synaptic Package Manageer)比较简单,所以这里主要总结在终端通过命令行方式进行的软件包安装、卸载和删除的方法。 一、Ubuntu中软件安装方法 1、APT方式 (1࿰…...
获取历史dokcer镜像项目,并上传gitlab,再打包镜像管理
今天遇到一个问题: 发现一个部署在Jenkins的脚本用的docker镜像是:test_project:v20191108,即这个项目是19年的一个版本,由于代码不断更新,用现在的最新代码运行该脚本,可能不能运行了,必须用19…...
【Go语言】Golang保姆级入门教程 Go初学者chapter3
Go语言 第三章 运算符 下划线“_”本身在Go中一个特殊的标识符,成为空标识符。可以代表任何其他的标识符,但是他对应的值就会被忽略 仅仅被作为站维度使用, 不能作为标识符使用 因为Go语言中没有private public 所以标记变量首字母大写代表其…...
网络防御(4)
一、结合以下问题对当天内容进行总结 1. 什么是IDS? 2. IDS和防火墙有什么不同? 3. IDS工作原理? 4. IDS的主要检测方法有哪些详细说明? 5. IDS的部署方式有哪些? 6. IDS的签名是什么意思?签名过滤器有什么…...
conda错误处理:ResolvePackageNotFound
当运行conda env create -f environment.yaml时出现"ResolvePackageNotFound"错误,这可能是由于环境配置文件中指定的依赖项无法找到或不可用。 错误消息中列出的依赖项包括pip20.3、python3.8.5和cudatoolkit11.3。 尝试以下解决方案: 更新…...
linux初学者小命令
linux初学者小命令 一.在正式学习linux命令之前需要先认识一下linux环境中命令是如何被执行的shell是一个属于linux内核的软件,在系统启动后加载进RAM(内存)内,每个用户通过终端登录系统后,就会运行。负责不间断的接收用户的输入,…...
宝尊电商短期前景堪忧,宝尊国际能否取得成功还有待验证
来源:猛兽财经 作者:猛兽财经 核心业务面临短期逆风 在2023年第一季度财报中,宝尊电商(BZUN)表示其电商业务(简称BEC)主要包括:品牌的门店运营、客户服务以及物流和供应链管理、IT和数字营销等增值服务”。…...
百川智能发布首个530亿参数闭源大模型,今年追上GPT-3.5
4月官宣创业,6月15日发布第一款7B开源模型,7月11日发布第二款13B、130亿参数开源模型。 平均保持2个月一个版本发布速度,8月8日,百川智能发布了创业以来的首个530亿参数闭源大模型——Baichuan-53B(以下简称“53B”&a…...
Redis的常用数据结构
StringListhashsetzset 1.字符串类型是Redis最基础的数据结构 使用场景: 缓存功能 Redis 作为缓存层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取。由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作…...
深入JVM - JIT分层编译技术与日志详解
深入JVM - JIT分层编译技术与日志详解 文章目录 深入JVM - JIT分层编译技术与日志详解1. 背景简介2. JIT 编译器2.1. 客户端版本的编译器: C12.2. 服务端版本的编译器: C22.3. Graal JIT 编译器 3. 分层编译技术(Tiered Compilation)3.1. 汇聚两种编译器的优点3.2. 精准优化(Ac…...
临时文档2
java 中 IO 流分为几种? 按照流的流向分,可以分为输入流和输出流;按照操作单元划分,可以划分为字节流和字符流;按照流的角色划分为节点流和处理流。 Java Io流共涉及40多个类,这些类看上去很杂乱,但实际…...
[深度学习入门]PyTorch深度学习[数组变形、批量处理、通用函数、广播机制]
目录 一、前言二、数组变形2.1 更改数组的形状2.1.1 reshape2.1.2 resize2.1.3 T(转置)2.1.4 ravel2.1.5 flatten2.1.6 squeeze2.1.7 transpose 2.2 合并数组2.2.1 append2.1.2 concatenate2.1.3 stack 三、批量处理四、通用函数4.1 math 与 numpy 函数的性能比较4.2 循环与向量…...
男孩向妈妈发脾气爸爸言传身教
近日,广东的一个家庭中发生了一件引人深思的事情。 一个男孩因为游戏没有通关,向妈妈发脾气,结果被爸爸发现并带到一边教育。 爸爸对孩子说:“她凭什么要承受你给的负能量,凭什么你心情不好就可以对着她发脾气…...
uniapp实现自定义导航内容高度居中(兼容APP端以及小程序端与胶囊对齐)
①效果图如下 1.小程序端与胶囊对齐 2.APP端内容区域居中 注意:上面使用的是colorui里面的自定义导航样式。 ②思路: 1.APP端和小程序端走不同的方法,因为小程序端要计算不同屏幕下右侧胶囊的高度。 2.其次最重要的要清晰App端和小程序端…...
Python调用外部电商API的详细步骤
Python是一种高级编程语言,非常适合用于集成API,即应用程序编程接口。API通常是由网站和各种软件提供的接口,可以让不同的程序之间进行数据交换和通信。在Python中调用API,可以帮助我们轻松地获取数据,并将其整合到我们…...
什么是NVME
1. 概念 NVM Express(NVMe),或称非易失性内存主机控制器接口规范(Non-Volatile Memory express),,是一个逻辑设备接口规范。他是与AHCI类似的、基于设备逻辑接口的总线传输协议规范(相当于通讯协议中的应用层…...
交叉编译驱动和应用出现警告提示错误“cc1:all warnings being treated as errors”解决方法
最近新玩的rk3588的板子,编译驱动时出现了警告提示错误“cc1:all warnings being treated as errors”,导致编译失败,仔细看了一下,就是内部出现了一个警告,一个未使用的变量出现的警告,导致了驱动编译失败,但是如果这样其他驱动会不会也这样,然后就写了一个printk的de…...
基于nodejs+vue+uniapp微信小程序的短视频分享系统
开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 3.1小程序端 用户注册页面,输入用户的个人信息点击注册即可。 注册完成后会返回到登录页面,用户输入自己注…...
fMRI(4-1)统计分析报告生成器说明
fMRI 统计分析报告生成器说明 文件:generate_stats_report.m 版本:v1.0 依赖:run_full_pipeline.m run_post_analysis.m 的完整输出 被试分组 CSV 目录 功能概述依赖环境目录结构要求输入参数输出文件全局配置参数调用方式数据预加载流程报…...
保姆级教程:手把手教你为RTA-OS硬件Counter写那4个要命的回调函数(含避坑指南)
嵌入式工程师实战指南:RTA-OS硬件计数器回调函数开发全解析 在汽车电子控制单元(ECU)开发中,实时操作系统(RTOS)的精确时间管理能力直接关系到系统可靠性。作为符合AUTOSAR标准的实时操作系统,R…...
Nebula Console深度解析:高效管理图数据库的核心技巧与实战指南
Nebula Console深度解析:高效管理图数据库的核心技巧与实战指南 【免费下载链接】nebula-console Command line interface for the Nebula Graph service 项目地址: https://gitcode.com/gh_mirrors/ne/nebula-console Nebula Console作为NebulaGraph图数据库…...
终极指南:如何快速上手AnimateAnyone - 3种角色动画制作方法
终极指南:如何快速上手AnimateAnyone - 3种角色动画制作方法 【免费下载链接】AnimateAnyone Unofficial Implementation of Animate Anyone by Novita AI 项目地址: https://gitcode.com/GitHub_Trending/ani/AnimateAnyone AnimateAnyone是一个基于姿势驱动…...
计算机视觉基础模型深度解析:13类算法、85个变种完全指南
计算机视觉基础模型深度解析:13类算法、85个变种完全指南做计算机视觉的兄弟应该知道,标注数据是真tm贵。为了不花这个钱,各路神仙开始用无标注数据、网上爬的图文数据、甚至多模态数据来训练模型。用对比学习、掩码重建这些方法整一个基础模…...
全网最全CV模型盘点:13类算法、85种变体详解
全网最全CV模型盘点:13类算法、85种变体详解做CV的都知道,标注数据成本太高。为了省钱,研究者开始用各种野路子:用没标注的数据、用爬取的图文、用多模态数据来预训练模型,再用对比学习、掩码重建这些方法让模型学会各…...
终极跨平台串口调试工具:5个秘诀让硬件调试效率翻倍
终极跨平台串口调试工具:5个秘诀让硬件调试效率翻倍 【免费下载链接】SerialPortAssistant This project is a cross-platform serial port assistant. It can run on WINDOWS, linux、android、macos system. 项目地址: https://gitcode.com/gh_mirrors/se/Seri…...
别再为建筑高度数据发愁了!手把手教你用QGIS加载2024版全国SHP建筑轮廓(含高度字段)
2024版全国建筑轮廓数据实战:QGIS三维可视化全流程解析 城市规划师拿到最新建筑轮廓数据后,最迫切的需求往往不是数据本身,而是如何快速将其转化为可分析的视觉成果。本文将彻底解决从SHP文件加载到三维渲染的完整工作流问题,特别…...
Playwright Python:企业级跨浏览器自动化测试的战略解决方案
Playwright Python:企业级跨浏览器自动化测试的战略解决方案 【免费下载链接】playwright-python Python version of the Playwright testing and automation library. 项目地址: https://gitcode.com/GitHub_Trending/pl/playwright-python 在当今快速发展的…...
Golang如何处理JSON空值null_Golang JSON空值处理教程【精通】
Go解析JSON时null被忽略或panic的解决方法:用*string等指针类型接收可空字段;对三态需求(null/空值/缺失)用NullString;避免interface{}和滥用json.RawMessage;优先用标准库,第三方库仅在性能或…...
