How to Implement the Observer Pattern in Rust

Implement the Observer pattern in Rust using a trait for notifications and a Subject struct managing a list of observers via smart pointers.

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");
}