Implement the Observer pattern in Rust by defining a Subject struct that holds a list of Box<dyn Observer> and an Observer trait with a notify method.
use std::cell::RefCell;
use std::rc::Rc;
trait Observer {
fn update(&self, message: &str);
}
struct Subject {
observers: RefCell<Vec<Rc<dyn Observer>>>,
}
impl Subject {
fn new() -> Self { Subject { observers: RefCell::new(vec![]) } }
fn attach(&self, observer: Rc<dyn Observer>) { self.observers.borrow_mut().push(observer); }
fn notify(&self, message: &str) {
for observer in self.observers.borrow().iter() { observer.update(message); }
}
}
struct ConcreteObserver {
name: String,
}
impl Observer for ConcreteObserver {
fn update(&self, message: &str) { println!("{} received: {}", self.name, message); }
}
fn main() {
let subject = Subject::new();
let obs1 = Rc::new(ConcreteObserver { name: "Observer 1".to_string() });
let obs2 = Rc::new(ConcreteObserver { name: "Observer 2".to_string() });
subject.attach(obs1);
subject.attach(obs2);
subject.notify("Hello World");
}