观察者模式

简介: 观察者模式是一种行为型设计模式,定义一对多的依赖关系,使被观察对象状态变化时能自动通知所有观察者。适用于事件系统、消息广播等场景,具有解耦、动态注册和自动通知的优点,但需注意性能与复杂性问题。

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得一个对象(被观察者或主题)的状态变化能够自动通知并更新其所有依赖的对象(观察者)。这种模式常用于实现事件系统、广播、消息传递等场景。

  1. 观察者模式的结构
    观察者模式主要包含以下几个角色:

主题(Subject):被观察的对象,维护观察者的列表,并在自身状态变化时通知所有观察者。
观察者(Observer):需要对主题的变化做出反应的对象,定义更新接口以接收通知。
具体主题(ConcreteSubject):实现主题接口,存储状态并在状态改变时通知观察者。
具体观察者(ConcreteObserver):实现观察者接口,定义具体的响应方法以处理通知。

  1. 观察者模式的 UML 图
    plaintext
    +----------------+
    |    Subject     |
    +----------------+
    | + attach()     |
    | + detach()     |
    | + notify()     |
    +----------------+
           ^
           |
    
    +-------+-------+
    | |
    +------------------+ +--------------------+
    | ConcreteSubject | | Observer |
    +------------------+ +--------------------+
    | - state | | + update() |
    +------------------+ +--------------------+
    | + getState() |
    | + setState() |
    +------------------+
  2. 观察者模式的实现
    以下是一个 Python 中观察者模式的简单示例:

3.1 定义主题和观察者接口
python
class Observer:
def update(self, state):
pass

class Subject:
def attach(self, observer: Observer):
pass

def detach(self, observer: Observer):
    pass

def notify(self):
    pass

3.2 实现具体主题
python
class ConcreteSubject(Subject):
def init(self):
self._observers = []
self._state = None

def attach(self, observer: Observer):
    self._observers.append(observer)

def detach(self, observer: Observer):
    self._observers.remove(observer)

def notify(self):
    for observer in self._observers:
        observer.update(self._state)

def set_state(self, state):
    self._state = state
    self.notify()

def get_state(self):
    return self._state

3.3 实现具体观察者
python
class ConcreteObserver(Observer):
def init(self, name):
self.name = name

def update(self, state):
    print(f"{self.name} received state update: {state}")

3.4 使用观察者模式
python
if name == "main":

# 创建具体主题
subject = ConcreteSubject()

# 创建观察者
observer1 = ConcreteObserver("Observer 1")
observer2 = ConcreteObserver("Observer 2")

# 注册观察者
subject.attach(observer1)
subject.attach(observer2)

# 改变主题状态
subject.set_state("State A")  # 通知所有观察者
subject.set_state("State B")  # 通知所有观察者
  1. 观察者模式的优缺点
    优点
    解耦合:观察者与主题之间的依赖关系降低,使得代码更为灵活,易于扩展和维护。
    动态注册:可以在运行时动态添加或移除观察者,灵活应对变化。
    自动通知:当主题状态改变时,所有相关的观察者都会自动收到通知,无需手动处理。
    缺点
    可能导致过度通知:在某些情况下,可能会有大量观察者被通知,可能导致性能问题,尤其是在观察者数量较多时。
    复杂性增加:维护观察者和主题之间的关系可能增加系统的复杂性。
    顺序依赖:如果观察者间存在依赖关系,可能需要额外的逻辑来确保通知顺序。
  2. 何时使用观察者模式
    当一个对象的状态改变需要同时更新其他对象时。
    当希望实现一对多的依赖关系,且observer需要在不影响subject的情况下进行独立操作时。
    当实现事件驱动的系统时,例如用户界面事件、消息传递等。
  3. 总结
    观察者模式是一种强大的设计模式,适用于需要维护对象之间动态关系的场景。通过解耦主题和观察者,观察者模式使得系统更加灵活和可维护。合理使用观察者模式,可以有效处理复杂的状态变化和事件通知,以提高系统响应性和可扩展性。
相关文章
|
Rust Oracle Java
针对 Minecraft 的 JVM 调优
Java 和 JVM 一直是一个很庞大的系统。Java 语言在 JVM 的基础上隐藏了很多细节,从而让程序员更关注功能而非性能。而 JVM 的作用则是对程序员编写的代码进行优化,因此 JVM 中引入了垃圾回收、即时编译等一系列先进而复杂的子系统。这种复杂度也使得 JVM 的性能并不像 C++、Go 或者 Rust 这样值观:你以为一段循环即可测量某个操作的性能,实际上这个操作可能随着循环的进行被即时编译机制优化。
6432 2
|
3月前
|
弹性计算 运维 数据可视化
阿里云幻兽帕鲁(Palworld)一键部署全攻略:零基础3分钟搭建专属联机服务器
《幻兽帕鲁》的爆火让越来越多玩家想要搭建专属联机服务器,和好友一起体验驯兽、建造、冒险的乐趣。2026年阿里云针对这款游戏推出了专属优化的一键部署方案,彻底打破了传统服务器搭建的技术壁垒,哪怕是零基础的游戏玩家,也能在3分钟内完成低延迟联机服务器的搭建,还支持自定义玩家数、PVP模式、存档导入与自动备份等功能,覆盖1-32人全场景游玩需求。只需完成阿里云实名认证并拥有Steam游戏账号,就能轻松变身服主,打造专属于你的帕鲁世界。本文将手把手拆解从服务器配置到游戏联机的全过程,还附带进阶配置、运维技巧和常见问题排查,让你全程无踩坑畅玩。
898 1
|
3月前
|
人工智能 自然语言处理 机器人
保姆级教程:阿里云及本地部署OpenClaw(Clawdbot)集成QQ机器人等Skills指南
2026年,OpenClaw(原Clawdbot)作为开源轻量级AI智能体框架,凭借插件化扩展、双部署兼容、自然语言驱动的核心优势,成为个人与中小企业搭建QQ机器人的首选工具。它既能通过本地私有化部署保障数据隐私,适配内网办公、私人助手等场景,也能在阿里云上实现7×24小时稳定运行,支撑QQ群管理、智能客服、自动化任务执行等高频需求,无需复杂开发,零基础也能快速落地专属QQ机器人,实现“QQ聊天窗口下达指令,AI自动完成任务”的轻量化交互模式。
2429 22
|
3月前
|
人工智能 自然语言处理 网络协议
2026年阿里云轻量服务器部署OpenClaw(Clawdbot)新手喂饭教程(零代码+全图解)
2026年,OpenClaw(前身为Clawdbot、Moltbot)凭借“自然语言指令+任务自动化执行”的核心优势,成为新手入门AI自动化的首选工具。这款开源AI代理平台无需专业编程基础,仅需输入日常口语化指令,就能完成文件处理、日程管理、多工具协同、代码生成等重复性工作,堪称“私人AI数字员工”。
675 7
|
机器学习/深度学习 SQL 人工智能
隐私计算框架“隐语”介绍及展望(附ppt)
隐私计算框架“隐语”介绍及展望(附ppt)
1317 0
|
数据采集 存储 监控
如何进行数据收集和分析
如何进行数据收集和分析
1075 1
|
人工智能 Android开发 C++
Harmony中的HAP、HAR、HSP区别
Harmony中的HAP、HAR、HSP区别
876 0
|
运维 监控 网络协议
IP 地址是什么,有什么用,通俗易懂答案?
**IP地址是互联网上设备的唯一标识,分为IPv4(32位,如192.168.1.1)和IPv6(128位,如2001:0db8:85a3:0000:0000:8a2e:0370:7334)。IP地址用于定位设备、数据包传递、网络安全和管理。分为公有(全球唯一)和私有(局域网内使用)IP,以及动态(DHCP分配)和静态(固定不变)IP。IP管理由ICANN和区域机构负责。了解IP地址基础知识对网络理解和故障排查至关重要。**
4802 3
|
机器学习/深度学习 算法 计算机视觉
YOLOv5 | 卷积模块 | 即插即用的可变核卷积AKConv【附代码+小白可上手】
本文介绍了YOLOv5模型的一个改进,即使用AKConv替代标准卷积以提高目标检测效果。AKConv允许卷积核有任意数量的参数和采样形状,增强了对不同目标形状和大小的适应性。教程详细讲解了AKConv的原理,提供了代码实现步骤,包括如何将AKConv添加到YOLOv5中,并给出了相关代码片段。此外,还分享了完整的YOLOv5 AKConv实现代码和GFLOPs计算,鼓励读者动手实践。通过这一改进,网络在保持性能的同时增加了灵活性。