pub struct ObserverRegistry<T: Observable> { /* private fields */ }Expand description
观察者注册表
管理一组观察者并在状态变化时通知它们。注册表维护观察者的弱引用列表, 避免强引用循环导致的内存泄漏。
§类型参数
T: 被观察者类型,必须实现Observabletrait
§设计特点
- 弱引用管理: 使用
Weak引用存储观察者,允许观察者在不再需要时被释放 - 自动清理: 在通知时自动跳过已释放的观察者弱引用
- 通知策略: 支持两种通知策略
- 防止重复: 检查观察者是否已存在,防止重复添加
§示例
use std::sync::Arc;
use rust_patterns_components::{Observable, Observer, ObserverRegistry, NotifyStrategy};
struct Sensor;
impl Observable for Sensor {
type State = String;
type Error = String;
fn attach(&mut self, _observer: Arc<dyn Observer<Subject = Self>>) {}
fn detach(&mut self, _observer: Arc<dyn Observer<Subject = Self>>) {}
}
let mut registry = ObserverRegistry::<Sensor>::default();
// 使用 registry.attach() 添加观察者
// 使用 registry.notify() 通知观察者Implementations§
Source§impl<T> ObserverRegistry<T>where
T: Observable,
impl<T> ObserverRegistry<T>where
T: Observable,
Sourcepub fn with_capacity(capacity: usize) -> Self
pub fn with_capacity(capacity: usize) -> Self
Sourcepub fn notify(
&self,
state: &<T as Observable>::State,
strategy: NotifyStrategy,
) -> Result<(), <T as Observable>::Error>
pub fn notify( &self, state: &<T as Observable>::State, strategy: NotifyStrategy, ) -> Result<(), <T as Observable>::Error>
通知所有观察者
向所有有效的观察者发送状态更新通知。
§参数
state: 要通知的新状态引用strategy: 通知策略,指定观察者失败时的行为 使用NotifyStrategy::StopOnError或NotifyStrategy::IgnoreError
§返回值
Ok(()): 所有观察者都成功处理了更新,或错误被忽略Err(<T as Observable>::Error): 某个观察者处理更新时返回了错误(当使用StopOnError策略时)
§通知策略
根据指定的通知策略决定行为:
NotifyStrategy::StopOnError: 立即返回第一个错误,停止通知其他观察者NotifyStrategy::IgnoreError: 忽略错误,继续通知其他观察者,总是返回Ok(())
§性能
此方法会自动清理无效的观察者弱引用(通过 Weak::upgrade 过滤)。
Trait Implementations§
Source§impl<T> Default for ObserverRegistry<T>where
T: Observable,
impl<T> Default for ObserverRegistry<T>where
T: Observable,
Source§fn default() -> Self
fn default() -> Self
创建默认的观察者注册表实例
等同于调用 ObserverRegistry::new()。
Auto Trait Implementations§
impl<T> Freeze for ObserverRegistry<T>
impl<T> !RefUnwindSafe for ObserverRegistry<T>
impl<T> !Send for ObserverRegistry<T>
impl<T> !Sync for ObserverRegistry<T>
impl<T> Unpin for ObserverRegistry<T>
impl<T> UnsafeUnpin for ObserverRegistry<T>
impl<T> !UnwindSafe for ObserverRegistry<T>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more