pub struct ObserverRegistry<T: Observable> { /* private fields */ }Expand description
观察者注册表
管理一组观察者并在状态变化时通知它们。注册表维护观察者的弱引用列表, 避免强引用循环导致的内存泄漏。
§类型参数
T: 被观察者类型,必须实现Observabletrait
§设计特点
- 弱引用管理: 使用
Weak引用存储观察者,允许观察者在不再需要时被释放 - 自动清理: 在通知时自动跳过已释放的观察者弱引用
- 通知策略: 支持两种通知策略
- 防止重复: 检查观察者是否已存在,防止重复添加
§示例
use std::sync::Arc;
use rust_patterns_components::{Observable, Observer, ObserverRegistry};
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,
) -> Result<(), <T as Observable>::Error>
pub fn notify( &self, state: &<T as Observable>::State, ) -> Result<(), <T as Observable>::Error>
Sourcepub fn notify_ignore_error(&self, state: &<T as Observable>::State)
pub fn notify_ignore_error(&self, state: &<T as Observable>::State)
通知所有观察者状态变化,忽略错误
此方法会通知所有已注册的观察者状态变化,但会忽略任何观察者返回的错误。 即使某个观察者处理更新失败,也会继续通知其他观察者。
§参数
state- 要通知的状态变化
§行为
- 遍历所有观察者并调用其
update方法 - 忽略所有观察者返回的错误(使用
let _ = ...) - 自动清理无效的观察者弱引用(通过
Weak::upgrade过滤)
§使用场景
适用于以下情况:
- 观察者的错误不应该阻止其他观察者接收通知
- 错误处理不是关键,可以安全忽略
- 需要确保所有观察者都能收到通知,即使某些观察者可能失败
§与 notify 方法的区别
notify: 遇到第一个错误就停止,并返回该错误notify_ignore_error: 忽略所有错误,继续通知所有观察者
§示例
use rust_pattern_components::{Observable, Observer, ObserverRegistry};
use std::sync::{Arc, Weak};
struct Counter {
registry: ObserverRegistry<Self>,
value: u64,
}
impl Observable for Counter {
type State = u64;
type Error = String;
fn attach(&mut self, observer: Arc<dyn Observer<Subject = Self>>) {
self.registry.attach(observer);
}
fn detach(&mut self, observer: Arc<dyn Observer<Subject = Self>>) {
self.registry.detach(observer);
}
}
let counter = Counter {
registry: ObserverRegistry::new(),
value: 42,
};
// 即使观察者可能失败,也会通知所有观察者
counter.registry.notify_ignore_error(&counter.value);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