Skip to main content

Observer

Trait Observer 

Source
pub trait Observer {
    type Subject: Observable;

    // Required method
    fn update(
        &self,
        state: &<Self::Subject as Observable>::State,
    ) -> Result<(), <Self::Subject as Observable>::Error>;
}
Expand description

观察者 trait

定义观察者必须实现的接口。观察者可以订阅被观察者的状态变化, 并在状态更新时通过 update 方法接收通知。

§关联类型

  • Subject: 观察者订阅的被观察者类型,必须实现 Observable trait

§方法

  • update: 接收状态更新通知

§实现要求

实现者需要指定具体的被观察者类型,并实现 update 方法。 update 方法应该快速返回,避免阻塞通知过程。

§线程安全

实现者应确保 update 方法是线程安全的,因为可能从多个线程调用。

§示例

use std::sync::Arc;
use rust_patterns_components::{Observer, Observable};

struct TemperatureSensor;

impl Observable for TemperatureSensor {
    type State = f64;
    type Error = String;

    fn attach(&mut self, _observer: Arc<dyn Observer<Subject = Self>>) {}
    fn detach(&mut self, _observer: Arc<dyn Observer<Subject = Self>>) {}
}

struct TemperatureDisplay;

impl Observer for TemperatureDisplay {
    type Subject = TemperatureSensor;

    fn update(&self, state: &f64) -> Result<(), String> {
        println!("当前温度: {:.1}°C", state);
        Ok(())
    }
}

Required Associated Types§

Source

type Subject: Observable

观察者订阅的被观察者类型

此类型必须实现 Observable trait,定义了观察者关注的状态和错误类型。

Required Methods§

Source

fn update( &self, state: &<Self::Subject as Observable>::State, ) -> Result<(), <Self::Subject as Observable>::Error>

接收状态更新通知

当被观察者状态发生变化时调用此方法。实现者应该:

  1. 处理传入的状态
  2. 返回 Ok(()) 表示处理成功
  3. 返回 Err(error) 表示处理失败
§参数
  • state: 当前的被观察者状态引用
§返回值
  • Ok(()): 成功处理状态更新
  • Err(<Self::Subject as Observable>::Error): 处理状态更新时发生错误
§错误处理

如果此方法返回错误,被观察者的 notify 方法会根据指定的通知策略 决定是否继续通知其他观察者。

Implementors§