Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Example program
- #include <iostream>
- #include <string>
- #include <memory>
- #include <algorithm>
- struct Event {
- std::string message;
- };
- class Observer {
- public:
- Observer(int pNum) : num(pNum) {}
- void notify(Event& e) {
- std::cout << "Observer #" << num << " received event: " << e.message << std::endl;
- }
- int getNum() {return num;}
- private:
- int num;
- };
- class Subject {
- public:
- Subject(int pNum) : num(pNum) {}
- int getNum() {return num;}
- void addObserver(std::shared_ptr<Observer> pObserver) {
- std::cout << "Added observer #" << pObserver->getNum() << " to observers of subject #" << num << std::endl;
- observers.emplace_back(pObserver);
- }
- void process(std::string pMessage) {
- Event event{pMessage};
- for(auto it=observers.begin(); it!=observers.end();) {
- auto sharedObserver = (*it).lock();
- if(sharedObserver) {
- sharedObserver->notify(event);
- ++it;
- } else {
- std::cout << "Removed invalid observer" << std::endl;
- it = observers.erase(it);
- }
- }
- }
- private:
- int num;
- std::vector<std::weak_ptr<Observer>> observers;
- };
- int main()
- {
- Subject subject(1);
- auto obs1 = std::make_shared<Observer>(1);
- auto obs2 = std::make_shared<Observer>(2);
- subject.addObserver(obs1);
- subject.addObserver(obs2);
- subject.process("Message 1");
- obs2 = nullptr;
- {
- auto obs3 = std::make_shared<Observer>(3);
- subject.addObserver(obs3);
- subject.process("Message 2");
- }
- subject.process("Message 3");
- subject.process("Message 4");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement