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)
那么从技术角度来看,上面给出的代码代表了一个观察者模式?因为否则它对我有用.但只是想知道什么构成观察者模式?
那么,从技术角度来看,上面给出的代码是否代表了观察者模式呢?
不
但只是想知道什么是观察者模式?
我已经更新了您的代码来模拟观察者模式。
#[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 会通知观察者。