线程安全的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
}