How can I implement the observer pattern in Rust?

后端 未结 5 965
轻奢々
轻奢々 2020-12-28 17:01

I have an observable collection and an observer. I want the observer to be a trait implementation of trait Observer. The observable object should be able to not

5条回答
  •  攒了一身酷
    2020-12-28 17:27

    rust design patterns https://github.com/lpxxn/rust-design-pattern

    trait IObserver {
        fn update(&self);
    }
    
    trait ISubject<'a, T: IObserver> {
        fn attach(&mut self, observer: &'a T);
        fn detach(&mut self, observer: &'a T);
        fn notify_observers(&self);
    }
    
    struct Subject<'a, T: IObserver> {
        observers: Vec<&'a T>,
    }
    impl<'a, T: IObserver + PartialEq> Subject<'a, T> {
        fn new() -> Subject<'a, T> {
            Subject {
                observers: Vec::new(),
            }
        }
    }
    
    impl<'a, T: IObserver + PartialEq> ISubject<'a, T> for Subject<'a, T> {
        fn attach(&mut self, observer: &'a T) {
            self.observers.push(observer);
        }
        fn detach(&mut self, observer: &'a T) {
            if let Some(idx) = self.observers.iter().position(|x| *x == observer) {
                self.observers.remove(idx);
            }
        }
        fn notify_observers(&self) {
            for item in self.observers.iter() {
                item.update();
            }
        }
    }
    
    #[derive(PartialEq)]
    struct ConcreteObserver {
        id: i32,
    }
    impl IObserver for ConcreteObserver {
        fn update(&self) {
            println!("Observer id:{} received event!", self.id);
        }
    }
    
    fn main() {
        let mut subject = Subject::new();
        let observer_a = ConcreteObserver { id: 1 };
        let observer_b = ConcreteObserver { id: 2 };
    
        subject.attach(&observer_a);
        subject.attach(&observer_b);
        subject.notify_observers();
    
        subject.detach(&observer_b);
        subject.notify_observers();
    }
    

    output

    Observer id:1 received event!
    Observer id:2 received event!
    Observer id:1 received event!
    

提交回复
热议问题