线程安全的Observer模式

C++
///@file ObserverSafe.cpp
///@author maxiaoxiao (tttxiaoz@163.com)
///@brief 线程安全的观察者模式, -std=c++17
///@version 0.1
///@date 2024-01-09
///
///@copyright Copyright (c) 2024 maxiaoxiao
///

#include <iostream>
#include <memory>
#include <mutex>
#include <vector>

class Subject;

// 观察者
class Observer : public std::enable_shared_from_this<Observer> {
public:
    virtual ~Observer();
    virtual void update() = 0;

    void observe(Subject* s);

protected:
    Subject* subject_;
};

// 观察对象 Subject
class Subject {
public:
    void attach(std::weak_ptr<Observer> x);
    // void detach(boost::weak_ptr<Observer> x);

    void notify() {
        std::lock_guard lock(mutex_);
        auto it = observers_.begin();
        while (it != observers_.end()) {
            std::shared_ptr<Observer> obj(it->lock());
            if (obj) {
                obj->update();
                ++it;
            } else {
                std::cout << "notify() erase\n";
                it = observers_.erase(it);
            }
        }
    }

private:
    mutable std::mutex mutex_;
    std::vector<std::weak_ptr<Observer>> observers_;
};

Observer::~Observer() {
    // subject_->detach(this);
}

void Observer::observe(Subject* s) {
    s->attach(shared_from_this());
    subject_ = s;
}

void Subject::attach(std::weak_ptr<Observer> x) { observers_.push_back(x); }

// ---------------------
class Foo : public Observer {
    virtual void update() { std::cout << "Foo::update() \n" << this << std::endl; }
};

int main() {
    Subject subject;
    {
        std::shared_ptr<Foo> p(new Foo);
        p->observe(&subject);
        subject.notify();
    }

    subject.notify();  // Observer p 不存在, 删除当前的Observer
}