在 C# 中,如何实现观察者模式?

news/2024/11/7 13:36:48/

观察者模式是一种设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当该主题对象的状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。这个模式常用于事件处理系统、通知系统等场景。

  • 主题(Subject):主题对象持有一个观察者列表,当自身状态发生变化时,通知所有观察者。通常包含方法来添加和移除观察者。
  • 观察者(Observer):一个接口或抽象类,当它所观察的主题状态发生变化时接受通知。每个观察者都实现一个更新方法,该方法会在主题状态改变时被调用。
  • 具体主题(Concrete Subject):具体实现的主题,并在状态发生变化时,通知观察者。
  • 具体观察者(Concrete Observer):具体实现的观察者,在接收到主题通知时执行相应的动作。

简单解释

想象一下,你是一本报纸的编辑(主题),有许多订阅者(观察者)想要在你出版新文章时被通知。当你完成一篇新文章时,你就会通知所有的订阅者。这就是观察者模式的基本思想。

  1. 定义观察者接口
// 定义一个观察者接口,所有的订阅者都需要实现这个接口
public interface ISubscriber
{// 更新方法,当主题有新消息时调用void Update(string article);
}
  1. 实现具体的观察者
// 实现具体的观察者类
public class Subscriber : ISubscriber
{private string name;// 构造函数,用于初始化订阅者的姓名public Subscriber(string name){this.name = name;}// 当收到新文章的通知时,输出相关信息public void Update(string article){Console.WriteLine($"{name} 收到了新文章: {article}");}
}
  1. 定义主题接口
// 定义主题接口,收集和管理所有订阅者
public interface INewsPaper
{// 添加订阅者void Subscribe(ISubscriber subscriber);// 移除订阅者void Unsubscribe(ISubscriber subscriber);// 发布新文章,通知所有订阅者void PublishArticle(string article);
}
  1. 实现具体的主题
using System.Collections.Generic;// 实现具体的主题类
public class NewsPaper : INewsPaper
{// 用于保存所有订阅者的列表private List<ISubscriber> subscribers = new List<ISubscriber>();// 添加新订阅者到列表public void Subscribe(ISubscriber subscriber){subscribers.Add(subscriber);}// 从列表中移除订阅者public void Unsubscribe(ISubscriber subscriber){subscribers.Remove(subscriber);}// 当有新文章时,通知所有订阅者public void PublishArticle(string article){Console.WriteLine($"出版新文章: {article}");foreach (var subscriber in subscribers){// 调用每个订阅者的更新方法subscriber.Update(article);}}
}
  1. 使用示例
class Program
{static void Main(string[] args){// 创建一个报纸对象NewsPaper newsPaper = new NewsPaper();// 创建订阅者对象ISubscriber alice = new Subscriber("Alice");ISubscriber bob = new Subscriber("Bob");// 订阅者 Alice 和 Bob 订阅了报纸newsPaper.Subscribe(alice);newsPaper.Subscribe(bob);// 发布新文章,订阅者会收到通知newsPaper.PublishArticle("观察者模式在C#中的使用");// Bob 决定退订不再接收新文章newsPaper.Unsubscribe(bob);// 发布另一篇文章,只有 Alice 会收到通知newsPaper.PublishArticle("C#编程实用技巧");}
}

运行结果

在这里插入图片描述

解释

  • ISubscriber 和 INewsPaper 是接口,定义了订阅者和报纸需要的功能。
  • Subscriber 是具体的观察者,收到新文章的通知后,会输出一条消息。
  • NewsPaper 是具体的主题,保存了一组订阅者,并在每次发布新文章时通知他们。
  • 在 Main 方法中,我们创建了一份报纸和两个订阅者,这些订阅者在文章发布时会收到通知。

http://www.ppmy.cn/news/1545080.html

相关文章

思维导图工具有哪些?10款思维导图特色介绍

电脑的普及&#xff0c;互联网的便捷。使我们平时工作、学习等场景下&#xff0c;常常离不开思维导图的辅助。思维导图是可以让我们所需要介绍的知识点以图文形式结合&#xff0c;展示出来。帮助我们方便理解。因此&#xff0c;一款好的思维导图工具&#xff0c;能让我们制作的…

Jdbc批处理功能和MybatisPlus

文章目录 1. 序言2. JDBC批处理功能和rewriteBatchedStatements3. JDBC批量插入的测试4. MybatisPlus#ServiceImpl.saveBatch()5. 结语&#xff1a;如果对大家有帮助&#xff0c;请点赞支持。如果有问题随时在评论中指出&#xff0c;感谢。 1. 序言 MybatisPlus的ServiceImpl类…

大模型微调:Adapter;在大模型基础上增加低秩矩阵或者adapter有什么用,这样还增加运算

目录 大模型微调:Adapter 一、Adapter的具体实现方式 二、为何能在大模型基础上实现特定功能 三、举例说明 在大模型基础上增加低秩矩阵或者adapter有什么用,这样还增加运算 增加低秩矩阵的用途和优势 增加Adapter的用途和优势 关于运算复杂性的考虑 大模型微调:Ada…

软件对象粒度控制与设计模式在其中作用的例子

在软件设计中&#xff0c;确定对象的粒度&#xff08;Granularity&#xff09;是一个重要的考量因素&#xff0c;它决定了对象的职责范围和复杂程度。粒度过细或过粗都可能影响系统的可维护性和性能。设计模式可以帮助我们在不同层面控制粒度和管理对象之间的交互。以下是对每种…

Chrome和夸克谁更护眼

在当今数字化时代&#xff0c;我们每天长时间面对电脑和手机屏幕&#xff0c;眼睛的健康问题变得越来越重要。浏览器作为我们日常使用频率极高的工具&#xff0c;其护眼功能的优劣直接影响到我们的视觉舒适度。本文将对Chrome和夸克两款主流浏览器进行对比&#xff0c;探讨它们…

构建多维分类知识库:Spring Boot实战

1 绪论 1.1 研究背景 在这个推荐个性化的时代&#xff0c;采用新技术开发一个多维分类的知识管理系统来分享和展示内容是一个永恒不变的需求。本次设计的多维分类的知识管理系统有管理员和用户两个角色。 管理员可以管理用户信息&#xff0c;知识分类&#xff0c;知识信息等&am…

制造业仓储信息化总体规划方案

文件是一份关于制造业仓储信息化的总体规划方案&#xff0c;主要内容包括项目背景、现状调研、项目目标、建设思路、业务蓝图设计方案、系统设计方案以及场景展示等。以下是对PPT内容的分析和总结&#xff1a; 1. 项目背景 目标&#xff1a;通过物流执行系统&#xff08;LES&a…

3^100的位数判断

3^100的位数判断 问题来源 字节面试&#xff0c;面试官提问&#xff1a;口算估计3^100的位数&#xff0c;或是给出位数估计范围。 解决方案 方法一&#xff1a; 该方法纯口算&#xff0c;可得一个较为准确的一个范围 2 100 < 3 100 < 4 100 2^{100}<3^{100}<…