观察者模式(Observer Pattern)
概念:
· 一种行为型设计模式;
· 用于对象间的一对多依赖;
· 适合解耦发布者和订阅者;
UML结构:
┌───────────┐ │ Subject │ ├───────────┤ │+ Attach() │ │+ Detach() │ │+ Notify() │ └───────────┘ ▲ │ ┌─────────┴─────────┐ │ │ ┌─────────────┐ ┌─────────────┐ │ConcreteSubject│ │ Observer │ └─────────────┘ ├─────────────┤ │- state │ │+ Update() │ │+ GetState() │ └─────────────┘ │+ SetState() │ └─────────────┘ ▲ │ ┌─────────────┐ │ConcreteObserver│ └─────────────┘ │- name │ │+ Update() │ └─────────────┘代码示例:
cs/// <summary> /// 抽象观察者接口 /// </summary> public interface IObserver { void Receive(); } /// <summary> /// 实际的观察者类 /// </summary> public class ConcreteObserver : IObserver { public string Name { get; set; } public void Receive() { Console.WriteLine($"监听者:{Name},接收到信号"); } } /// <summary> /// 上下文(也叫被观察者类) /// </summary> public class Context { private readonly List<IObserver> listeners = new(); public void AddListener(IObserver observer) { if (observer != null && !listeners.Contains(observer)) { listeners.Add(observer); } } public void RemoveListener(IObserver observer) { listeners.Remove(observer); } /// <summary> /// 通知所管理的观察者 /// </summary> public void Notify() { // 使用for循环,避免在遍历时有观察者被移除而发生异常 for (int i = 0; i < listeners.Count; i++) { listeners[i].Receive(); } } } /// <summary> /// 客户端 /// </summary> public class Client { public static void Main() { IObserver observerA = new ConcreteObserver(); IObserver observerB = new ConcreteObserver(); Context context = new Context(); context.AddListener(observerA); context.AddListener(observerB); context.Notify(); } }特点:
优点:· 实现对象之间的松耦合:主题和观察者不直接依赖具体实现;
· 支持广播通信:一个主题可以通知多个观察者;
· 动态灵活:可以随时增加或减少观察者;
缺点:· 观察者过多会导致性能下降;
· 需要注意对观察者的管理;
· 若观察者之间也需要相互观察,可能会导致无限的循环;
适用场景:
· 事件驱动系统:点击一个按钮,通知其他组件;
· 数据变化通知;
· 消息订阅机制:消息队列、广播系统、游戏状态的更新;
举例场景:
· 游戏中血条的变化;
· 股票价格的涨跌通知;
· 按钮点击的响应;
【设计模式】观察者模式
大飞pkz2025-10-03 16:45
相关推荐
2603_965148115 小时前
如何解析JSON数据?API返回的商品信息处理教程波波0076 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流知无不研8 小时前
lambda表达式的使用(3)cfm_29148 小时前
SpringAI + Ollama 本地大模型wujian83119 小时前
怎么用千问生成word文档:从「格式崩」到「一键过」,AI导出鸭打通最后半厘米C++ 老炮儿的技术栈9 小时前
基于Qt实现轻量化本地音乐播放器qq_448011169 小时前
C语言中的柔性数组小白学大数据10 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量zlinear数据采集卡10 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现Poo_Chai10 小时前
QT emit信号后完整处理流程,包括槽函数响应流程