#include <iostream>
#include <memory>
#include <vector>
class Observer;
class Subject {
public:
void notifyObservers();
void registerObserver(std::weak_ptr<Observer> obs);
private:
std::vector<std::weak_ptr<Observer>> observers;
};
class Observer {
public:
virtual ~Observer() {}
virtual void update() = 0;
};
class ConcreteObserver : public Observer {
public:
ConcreteObserver() {
std::cout << "ConcreteObserver created\n";
}
virtual void update() override {
std::cout << "ConcreteObserver::update called\n";
}
};
void Subject::notifyObservers() {
for(std::weak_ptr<Observer> obs : observers) {
if(auto sharedObs = obs.lock()) {
sharedObs->update();
}
}
}
void Subject::registerObserver(std::weak_ptr<Observer> obs) {
observers.push_back(obs);
}
int main() {
auto subject = std::make_shared<Subject>();
{
auto observer = std::make_shared<ConcreteObserver>();
subject->registerObserver(observer);
}
subject->notifyObservers();
return 0;
}