Skip to content

Instantly share code, notes, and snippets.

@FONQRI
Created December 30, 2017 12:18
Show Gist options
  • Save FONQRI/2f628bea9fe57a05fd92968ce4804197 to your computer and use it in GitHub Desktop.
Save FONQRI/2f628bea9fe57a05fd92968ce4804197 to your computer and use it in GitHub Desktop.
C++ Observer Pattern‌ Base
#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