此代码是否遵循观察者模式?

csh*_*rad 5 rust observer-pattern

我试图将观察者模式应用于Rust.与其他GC语言(如JS或Java)一样,我想Observable在事件中发送对数据的引用Observer.但是由于借用检查器,编译器继续让我头疼.因此,我学会了使用,Rc但它没有让我改变价值,Observable然后我使用了一个RefCell内部可变性,这是我想要的.霍拉我说.但后来我意识到Rc导致从不同地方引用单个位置的原因导致事件系统Observer过时.所以在删除事件方法之后Observer,我得到了:

struct Observable<T: Clone> {
    value: Rc<RefCell<T>>
}

impl<T: Clone> Observable<T> {
    fn new(value: T) -> Observable<T> {
        Observable {
            value: Rc::new(RefCell::new(value))
        }
    }

    fn set_value(&mut self, value: T) {
        *self.value.borrow_mut() = value;
    }

    fn register(&mut self) -> Observer<T> {
        Observer::new(self.value.clone())
    }
}

struct Observer<T: Clone> {
    value: Rc<RefCell<T>>
}

impl<T: Clone> Observer<T> {
    fn new(value: Rc<RefCell<T>>) -> Observer<T> {
        Observer {
            value
        }
    }

    fn value(&self) -> T {
        (*self.value.borrow()).clone()
    }
}
Run Code Online (Sandbox Code Playgroud)

链接到Rust Playground

那么从技术角度来看,上面给出的代码代表了一个观察者模式?因为否则它对我有用.但只是想知道什么构成观察者模式?

mat*_*thu 4

那么,从技术角度来看,上面给出的代码是否代表了观察者模式呢?

但只是想知道什么是观察者模式?

我已经更新了您的代码来模拟观察者模式。

#[allow(unused_variables)]
pub trait Events {
    fn on_value(&self, value: &str) {}
}
struct Observable {
    value: String,
    observers: Vec<Box<Events>>,
}

impl Observable {
    fn new(value: &str) -> Observable {
        Observable {
            value: value.to_owned(),
            observers: Vec::new(),
        }
    }

    fn set_value(&mut self, value: &str) {
        self.value = value.to_owned();
        // send event to observers
        for observer in &self.observers {
            observer.on_value(value);
        }
    }

    fn register<E: Events + 'static>(&mut self, observer: E) {
        self.observers.push(Box::new(observer));
    }
}

struct Observer;

impl Events for Observer {
    fn on_value(&self, value: &str) {
        println!("received value: {:?}", value);
    }
}

fn main() {
    let mut observable = Observable::new("initial value");
    observable.register(Observer);
    observable.set_value("updated value");
}
Run Code Online (Sandbox Code Playgroud)

Observable是主题,它维护一个观察者列表。当设置新值时,Observable 会通知观察者。

链接到游乐场

关于 Rust 中的观察者模式的博客文章