Created
December 30, 2017 12:18
-
-
Save FONQRI/2f628bea9fe57a05fd92968ce4804197 to your computer and use it in GitHub Desktop.
C++ Observer Pattern Base
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <set> | |
using namespace std; | |
// ---------------- Observer interface ----------------- | |
class MyObserver { | |
public: | |
virtual void Notify() = 0; | |
}; | |
// ---------------- Observable object ------------------- | |
class MyObservable { | |
static MyObservable *instance; | |
set<MyObserver *> observers; | |
MyObservable(){}; | |
public: | |
static MyObservable *GetInstance(); | |
void AddObserver(MyObserver &o); | |
void RemoveObserver(MyObserver &o); | |
void NotifyObservers(); | |
void Trigger(); | |
}; | |
MyObservable *MyObservable::instance = NULL; | |
MyObservable *MyObservable::GetInstance() | |
{ | |
if (instance == NULL) { | |
instance = new MyObservable(); | |
} | |
return instance; | |
} | |
void MyObservable::AddObserver(MyObserver &o) { observers.insert(&o); } | |
void MyObservable::RemoveObserver(MyObserver &o) { observers.erase(&o); } | |
void MyObservable::NotifyObservers() | |
{ | |
set<MyObserver *>::iterator itr; | |
for (itr = observers.begin(); itr != observers.end(); itr++) | |
(*itr)->Notify(); | |
} | |
// TEST METHOD TO TRIGGER | |
// IN THE REAL SCENARIO THIS IS NOT REQUIRED | |
void MyObservable::Trigger() { NotifyObservers(); } | |
// ------ Concrete class interested in notifications --- | |
class MyClass : public MyObserver { | |
MyObservable *observable; | |
public: | |
MyClass() | |
{ | |
observable = MyObservable::GetInstance(); | |
observable->AddObserver(*this); | |
} | |
~MyClass() { observable->RemoveObserver(*this); } | |
void Notify() { cout << "Received a change event" << endl; } | |
}; | |
int main() | |
{ | |
MyObservable *observable = MyObservable::GetInstance(); | |
MyClass *obj = new MyClass(); | |
observable->Trigger(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment