当前位置: 首页 > news >正文

C#实现观察者模式

  观察者模式是一种软件设计模式,当一个对象的状态发生变化时,其所有依赖者都会自动得到通知。

  观察者模式也被称为“发布-订阅”模式,它定义了对象之间的一对多的依赖性,当一个对象状态改变时,所有依赖于它的对象都会得到通知并进行更新。观察者模式通常用于实现事件机制:一个对象触发自己的一个事件,也就是改变自己的状态,然后通知其他的一切依赖于它的对象。

  在观察者模式中,主要有两种角色:

  1. 主题(Subject):它是被观察的对象。当主题的状态发生改变时,会通知所有已注册的观察者。
  2. 观察者(Observer):它是依赖于主题的对象,当接到主题的通知时,会更新自己的状态。

  观察者模式的主要优点是它支持动态的关联,一个系统对象的行为依赖于另一个系统对象的状态。并且它是一种松耦合的设计模式,一个主题不必知道其任何观察者,例如观察者的具体类。

  观察者模式广泛应用于各种编程语言的库和框架中,例如在.NET中,它被用于实现事件模型。

  然而,观察者模式也有一些缺点。例如,如果一个主题有大量的直接和间接的观察者,将会花费大量的时间来通知所有的观察者。另外,如果观察者和主题之间存在循环依赖,可能会导致系统行为的不确定性。

  以下是一个基本的观察者模式的实现:

  首先,我们定义一个IObserver接口和一个ISubject接口:

public interface IObserver
{void Update(string message);
}public interface ISubject
{void RegisterObserver(IObserver observer);void RemoveObserver(IObserver observer);void NotifyObservers(string message);
}

然后,我们实现一个具体的主题Subject

public class Subject : ISubject
{private List<IObserver> observers = new List<IObserver>();public void RegisterObserver(IObserver observer){observers.Add(observer);}public void RemoveObserver(IObserver observer){if (observers.Contains(observer)){observers.Remove(observer);}}public void NotifyObservers(string message){foreach (var observer in observers){observer.Update(message);}}
}

接下来,我们实现一个具体的观察者Observer

public class Observer : IObserver
{private string name;public Observer(string name){this.name = name;}public void Update(string message){Console.WriteLine($"{name} received: {message}");}
}

最后,我们可以创建一个主题和多个观察者,并将观察者注册到主题上:

namespace ObserverMode
{internal class Program{static void Main(string[] args){Console.WriteLine("测试C#单例模式");ISubject subject = new Subject();IObserver observer1 = new Observer("Observer1");IObserver observer2 = new Observer("Observer2");subject.RegisterObserver(observer1);subject.RegisterObserver(observer2);subject.NotifyObservers("Hello, observers!");}}
}

运行结果
在这里插入图片描述

  在这个例子中,当我们调用NotifyObservers方法时,注册到subject的所有观察者都会得到通知,并调用它们的Update方法。

http://www.lryc.cn/news/234553.html

相关文章:

  • 什么是持续部署
  • 【Python】Loguru模块更简洁的日志记录库
  • 智慧环保:科技驱动下的环境保护新篇章
  • CTF-PWN环境搭建手册
  • Nginx安装配置与SSL证书安装部署
  • 高性能面试八股文之编译流程程序调度
  • opencv的MinGW-W64编译
  • 在Go编程中调用外部命令的几种场景
  • python学习:break用法详解
  • 【算法萌新闯力扣】:找到所有数组中消失对数字
  • Node.js 安装配置
  • 前端JS 使用input完成文件上传操作,并对文件进行类型转换
  • 探索AI交互:Python与ChatGPT的完美结合!
  • CI/CD - jenkins
  • 【【萌新的SOC学习之 VDMA 彩条显示实验之一】】
  • 相机通用类之海康相机,软触发硬触发(飞拍),并输出halcon格式对象
  • linux时间调整
  • C++模版初阶
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • Go 语言结构体验证详解:validate 标签与自定义规则
  • ​软考-高级-系统架构设计师教程(清华第2版)【第19章 大数据架构设计理论与实践 (P691~716)-思维导图】​
  • 深度学习YOLOv5车辆颜色识别检测 - python opencv 计算机竞赛
  • c语言-浅谈指针(3)
  • 从服务器端获取人脸数据,在本地检测特征,并将特征发送给服务器
  • ARDUINO UNO 12颗LED超酷流水灯效果
  • Linux下查看pytorch运行时真正调用的cuda版本
  • ​分享mfc140u.dll丢失的解决方法,针对原因解决mfc140u.dll丢失的问题
  • torch_cluster、torch_scatter、torch_sparse三个包的安装
  • 软件安利——火绒安全
  • Induced AI:一个专门为自动化任务而设计的AI原生浏览器RPA平台