在大型软件系统中,观察者模式(Observer Pattern)是一种非常常用的设计模式,用于对象之间的一对多依赖关系。Chromium 的 base 库提供了 ObserverList 与 ObserverListThreadSafe 两种实现,它们在浏览器内核的事件订阅、异步消息处理、模块解耦中被广泛使用。本文将从概念、源码、用法、对比及常见坑等角度,全面解析 Chromium 中 Observer 模式的实现。
一、Observer 模式概念回顾
Observer 模式,又称发布-订阅模式,核心思想是:
-
Subject(被观察者):维护一个观察者列表,当自身状态改变时,通知所有观察者。
-
Observer(观察者):定义一个接口,当被观察者状态发生变化时接收通知。
UML 简单示意:
+-----------+ +------------+ | Subject |<>-------->| Observer | +-----------+ +------------+ | observers | | update() | | attach() | +------------+ | detach() | | notify() | +-----------+
在 Chromium 中,ObserverList 完全实现了这种一对多通知机制,并提供了线程安全版本 ObserverListThreadSafe。
二、ObserverList 概述
ObserverList 是 Chromium base 提供的非线程安全版本的观察者列表,适用于单线程场景。
1. 头文件及基本类型
#include "base/observer_list.h"
常用类型:
base::ObserverList<MyObserver> observers;
-
MyObserver必须是抽象类或接口类。 -
支持三种通知策略:
-
ObserverListPolicy::EXISTING_ONLY:只通知已经存在的观察者。 -
ObserverListPolicy::NOTIFY_EXISTING_ONLY:仅通知当前存在的观察者。 -
ObserverListPolicy::CHECK_EMPTY:调试模式检查列表为空。
-
2. ObserverList API
class ObserverList<ObserverType, CheckedType = DEFAULT, AllowEmpty = false> { public: void AddObserver(ObserverType* observer); void RemoveObserver(ObserverType* observer); template <typename Func

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



