In this behavioral design pattern all observer getting notified of a change from a subject they are registered at.
#include <string>
#include <set>
#include <algorithm>
#include <iostream>
using namespace std;
// --- Observer ----------
class Observer
{
public:
virtual void onInput(string) = 0;
};
// --- Subject ----------
class Subject
{
public:
virtual void attach(Observer*) = 0;
virtual void detach(Observer*) = 0;
virtual void input(string) = 0;
};
// --- Implementation ---
class View : Subject
{
private:
set<Observer*> obs;
public:
void attach(Observer *ob){obs.insert(ob);}
void detach(Observer *ob){obs.erase(ob);}
void input(string input)
{
for(auto ob : obs){
ob->onInput(input);
}
}
};
class Parser : Observer
{
public:
void onInput(string input)
{
parse(input);
}
private:
void parse(string input)
{
cout << "Parse: " + input << endl;
}
};
int main()
{
View view;
Parser parser;
view.attach((Observer*)&parser);
// --- Emulate Input ---
view.input("(3+2)*4");
return 0;
}