Thursday, August 01, 2019

Program - Observer Pattern

#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;
}

Friday, July 26, 2019

Some questions

1. Find if there is a junction in two linked lists.
2. A number is stored in an Array. Add 1 to that number.
3. There are n steps. one can walk 1 or 2 steps at a time. What are the number of possible ways to climb the steps. Then make it 1 or 2 or...n steps at a time.
4. Reverse the order of words in a sentence.
5. Find the repeated characters in a string.