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

107、23种设计模式之观察者模式(16/23)

一、模式定义

观察者模式(Observer Pattern)是一种行为型设计模式,通过定义对象间的一对多依赖关系,实现当被观察对象(Subject)状态变化时,自动通知所有注册的观察者(Observer)并触发更新。其核心在于解耦被观察者与观察者,使两者可独立扩展和修改。

二、优缺点分析

1.优点

  • 松耦合架构:被观察者与观察者通过接口交互,无需直接引用具体类,降低模块间依赖。
  • 动态扩展性:支持运行时动态添加/移除观察者,符合开闭原则。
  • 事件驱动:适用于需要实时响应状态变化的场景,如GUI、消息系统。

2.缺点

  • 性能开销:大量观察者可能导致通知延迟,尤其在复杂系统中。
  • 循环依赖风险:若观察者与被观察者相互引用,可能引发无限循环调用。
  • 通知顺序不可控:观察者接收通知的顺序可能影响业务逻辑。

三、典型应用场景

1.GUI事件处理

  • 示例:按钮点击触发日志记录、界面更新、数据提交。
  • 实现:Java Swing的ActionListener、Android的OnClickListener。

2.实时数据同步

  • 示例:股票行情系统,股价变动时更新所有投资者界面。
  • 实现:前端框架(Vue/React)的数据绑定机制。

3.监控与报警系统

  • 示例:服务器CPU超阈值时触发邮件报警、日志记录、自动扩容。
  • 实现:Prometheus监控系统结合Alertmanager。

4.游戏事件系统

  • 示例:玩家生命值归零时触发死亡动画、保存进度、播放音效。
  • 实现:Unity的UnityEvent或自定义事件总线。

四、C#代码示例

场景:玩家击中敌人时,触发爆炸动画并减少敌人数量。

using System;
using System.Collections.Generic;// 观察者接口
public interface IObserver
{void Update();
}// 具体观察者:爆炸事件
public class ExplosionEvent : IObserver
{public void Update(){Console.WriteLine("爆炸动画播放!");}
}// 具体观察者:敌人数量管理
public class EnemyManager : IObserver
{public int EnemyCount { get; private set; } = 10;public void Update(){EnemyCount--;Console.WriteLine($"剩余敌人数量:{EnemyCount}");}
}// 被观察者:玩家
public class Player
{private List<IObserver> _observers = new List<IObserver>();public void AddObserver(IObserver observer) => _observers.Add(observer);public void RemoveObserver(IObserver observer) => _observers.Remove(observer);public void NotifyObservers(){foreach (var observer in _observers){observer.Update();}}public void HitEnemy(){Console.WriteLine("玩家击中敌人!");NotifyObservers();}
}// 客户端代码
class Program
{static void Main(){Player player = new Player();IObserver explosion = new ExplosionEvent();IObserver enemyManager = new EnemyManager();player.AddObserver(explosion);player.AddObserver(enemyManager);player.HitEnemy(); // 触发观察者更新}
}

五、关键点总结

1.角色划分:

  • Subject(被观察者):维护观察者列表,提供注册/注销接口。
  • Observer(观察者):定义更新接口,实现具体响应逻辑。

2.通知机制:

  • 推模式(Push):被观察者主动传递数据(如Update(float temp))。
  • 拉模式(Pull):观察者主动获取数据(如Update(Subject subject))。

3.线程安全:

  • 在多线程环境中,需同步观察者列表操作(如加锁或使用并发集合)。

4.内存管理:

  • 及时移除无效观察者,避免内存泄漏(如C#中需处理事件订阅的解绑)。

5.性能优化:

  • 批量通知:合并高频更新,减少通知次数。
  • 异步通知:通过任务队列或消息总线解耦通知逻辑。

六、进阶实践

  • 事件总线(Event Bus):集中管理事件与订阅者,适用于分布式系统。
  • Rx(Reactive Extensions):基于观察者模式的响应式编程库,支持链式操作和组合。
  • MVC/MVVM架构:视图作为观察者,模型作为被观察者,实现数据驱动UI。

观察者模式通过解耦与动态扩展能力,成为构建高可维护性系统的基石。在实际开发中,需结合具体场景权衡性能与灵活性,避免过度设计。

在这里插入图片描述

http://www.dtcms.com/a/456912.html

相关文章:

  • Linux进程第五讲:PPID与bash的关联、fork系统调用的原理与实践操作(上)
  • 精品购物网站如何创建个人主页
  • 怎样建设电子商务网站wordpress 4.9 中文
  • AI赋能锂电:机器学习加速电池技术革新
  • await
  • 机器学习-常用库
  • 前端网络与优化
  • (二) 机器学习之卷积神经网络
  • GAN入门:生成器与判别器原理(附Python代码)
  • 企业网站seo报价校园门户网站开发需求
  • RabbitMQ核心机制
  • 四、代码风格规范
  • 做网站采集青岛做教育的网站建设
  • Ethernaut Level 8: Vault - 私有变量读取
  • 去水印擦除大师 3.7.6 | 专门用于去除视频和图片水印的工具,支持多个热门平台无水印下载
  • 关键词排名优化网站东营交通信息网官网
  • 【URP】Unity[内置Shader]复杂光照ComplexLit
  • 【Linux】vim的操作大全
  • Web Worker:释放前端性能的“后台线程”技术
  • 机械行业网站建设方案电商公司有哪些?
  • 赋能智能制造领域:全星QMS质量管理软件系统深度解析
  • java返回参数报错
  • cesium126,230217,Pixel Streaming in Unreal Engine 像素流 - 1 基本概念:
  • JavaScript基础知识
  • 以太网数据报文各协议字段深度解析(第一、二章)
  • microsoft做网站浙江建设培训中心网站
  • 从LLM角度学习和了解MoE架构
  • 【学习笔记06】内存管理与智能指针学习总结
  • 0、FreeRTOS编码和命名规则
  • 无锡专业制作网站wordpress 手风琴