观察者模式

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

观察者模式(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 这样值观:你以为一段循环即可测量某个操作的性能,实际上这个操作可能随着循环的进行被即时编译机制优化。
6018 2
|
前端开发
【前端|CSS系列第3篇】CSS盒模型、浮动及定位
【前端|CSS系列第3篇】CSS盒模型、浮动及定位
313 1
|
存储 编解码 算法
H.264编码及AAC编码基础 3
H.264编码及AAC编码基础
706 0
|
2月前
|
缓存 JSON JavaScript
TypeScript 快速上手指南
TypeScript是JavaScript的超集,支持静态类型,提升代码质量与可维护性。本文涵盖环境搭建、核心语法、实战示例及工程化配置,零基础也能快速上手,适合Vue3、React等大型项目开发。
|
2月前
|
存储 关系型数据库 MySQL
B+ 树索引
B+树是MySQL InnoDB引擎的核心索引结构,具自平衡、有序存储特性,支持高效查找、插入、删除。所有数据存于叶子节点,且叶节点相连,利于范围查询。广泛用于读密集、排序及范围检索场景,显著降低磁盘I/O,提升查询性能,是数据库优化的关键技术。
|
2月前
|
JavaScript 前端开发 API
Vue.js 快速上手指南
Vue.js 是轻量级渐进式前端框架,核心聚焦视图层,上手简单、生态丰富。本文提供可直接复制的快速入门指南,涵盖 Vue3 组合式 API、响应式数据、指令、组件化、生命周期及 Axios 异步请求等实战内容,附完整示例与避坑提示,零基础也能快速搭建交互式页面,助力高效开发。
|
2月前
|
自然语言处理 关系型数据库 MySQL
MySQL 全文索引
MySQL全文索引支持对CHAR、VARCHAR、TEXT字段进行高效文本搜索,适用于文章、评论等长文本。通过MATCH()与AGAINST()实现自然语言或布尔模式查询,支持分词、停用词过滤和最小词长设置。可创建于建表时或后期添加,适用于搜索引擎、CMS、电商等场景,提升关键词检索效率,但需权衡增删改开销与索引维护成本。(238字)
|
2月前
|
存储 JSON JavaScript
JSON 快速上手指南
JSON是一种轻量级数据交换格式,语法严格,键名需双引号、值类型有限,支持跨语言解析。本文详解其语法规则、与JS对象区别、序列化/解析方法(stringify/parse)、实战应用及常见避坑技巧,助你快速掌握JSON核心技能。
|
3月前
|
传感器 供应链 监控
1688商家必看:如何高效转化精准流量?四大核心策略深度解析
本文针对1688平台B2B商家流量转化难题,提出四大核心策略:优化商品基础提升信任、科学关联销售提高客单价、构建专业客服体系促进成交、打造差异化价值突破同质竞争。通过系统化运营与数据驱动,助力商家实现从“有流量”到“能成交”的高效转化闭环。
|
存储 人工智能 关系型数据库
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!
10个行锁、死锁案例⭐️24张加锁分析图🚀彻底搞懂Innodb行锁加锁规则!