#include <iostream>
#include <forward_list>
using namespace std;
class abstractObs
{
public:
virtual void update(int, int, int) = 0;
};
class abstractSubject
{
virtual void notify()=0;
protected:
forward_list<abstractObs *> obsList;
public:
void registerObs(abstractObs *);
void unregisterObs(abstractObs *);
};
void abstractSubject::registerObs(abstractObs *inObs)
{
obsList.push_front(inObs);
}
void abstractSubject::unregisterObs(abstractObs *inObs)
{
obsList.remove(inObs);
}
class actualSubject : public abstractSubject
{
private:
int runs, wickets, overs;
actualSubject();
virtual void notify();
public:
static actualSubject * actualSubjectPtr;
static actualSubject * getActualSubject();
void setData(int inRuns, int inWickets, int inOvers)
{
runs=inRuns;
wickets=inWickets;
overs=inOvers;
notify();
}
};
actualSubject * actualSubject::actualSubjectPtr = NULL;
actualSubject::actualSubject()
:runs(0),wickets(0),overs(0){}
void actualSubject::notify()
{
for(auto it = begin(obsList); it != end(obsList); it++)
(*it)->update(runs, wickets, overs);
}
actualSubject * actualSubject::getActualSubject()
{
if(NULL == actualSubject::actualSubjectPtr)
actualSubject::actualSubjectPtr = new actualSubject();
return actualSubject::actualSubjectPtr;
}
class displayRuns:public abstractObs
{
public:
void update(int, int, int);
};
void displayRuns::update(int runs, int wickets, int overs)
{
cout<<"Runs are:"<< runs << endl;
}
class displayWickets:public abstractObs
{
public:
void update(int, int, int);
};
void displayWickets::update(int runs, int wickets, int overs)
{
cout<<"Wickets are:"<<wickets<<endl;
}
int main()
{
actualSubject *sub = actualSubject::getActualSubject();
displayRuns runObj;
displayWickets wicObj;
sub->registerObs(&runObj);
sub->setData(1,2,3);
sub->registerObs(&wicObj);
sub->setData(1,4,3);
sub->unregisterObs(&runObj);
sub->setData(1,2,6);
return 0;
}
#include <forward_list>
using namespace std;
class abstractObs
{
public:
virtual void update(int, int, int) = 0;
};
class abstractSubject
{
virtual void notify()=0;
protected:
forward_list<abstractObs *> obsList;
public:
void registerObs(abstractObs *);
void unregisterObs(abstractObs *);
};
void abstractSubject::registerObs(abstractObs *inObs)
{
obsList.push_front(inObs);
}
void abstractSubject::unregisterObs(abstractObs *inObs)
{
obsList.remove(inObs);
}
class actualSubject : public abstractSubject
{
private:
int runs, wickets, overs;
actualSubject();
virtual void notify();
public:
static actualSubject * actualSubjectPtr;
static actualSubject * getActualSubject();
void setData(int inRuns, int inWickets, int inOvers)
{
runs=inRuns;
wickets=inWickets;
overs=inOvers;
notify();
}
};
actualSubject * actualSubject::actualSubjectPtr = NULL;
actualSubject::actualSubject()
:runs(0),wickets(0),overs(0){}
void actualSubject::notify()
{
for(auto it = begin(obsList); it != end(obsList); it++)
(*it)->update(runs, wickets, overs);
}
actualSubject * actualSubject::getActualSubject()
{
if(NULL == actualSubject::actualSubjectPtr)
actualSubject::actualSubjectPtr = new actualSubject();
return actualSubject::actualSubjectPtr;
}
class displayRuns:public abstractObs
{
public:
void update(int, int, int);
};
void displayRuns::update(int runs, int wickets, int overs)
{
cout<<"Runs are:"<< runs << endl;
}
class displayWickets:public abstractObs
{
public:
void update(int, int, int);
};
void displayWickets::update(int runs, int wickets, int overs)
{
cout<<"Wickets are:"<<wickets<<endl;
}
int main()
{
actualSubject *sub = actualSubject::getActualSubject();
displayRuns runObj;
displayWickets wicObj;
sub->registerObs(&runObj);
sub->setData(1,2,3);
sub->registerObs(&wicObj);
sub->setData(1,4,3);
sub->unregisterObs(&runObj);
sub->setData(1,2,6);
return 0;
}