As we know, there are three types of design patterns such as
1. Abstract design pattern
2. Structural design pattern
3.Behavioral design pattern
but it is important to know that the Observer design pattern is a behavioral design pattern
Intent
There will be one too many dependencies among different objects if the subject state changes its state then all its dependents will be updated and notified
this time, suppose that we have the bus depo station in a city and we consider it a subject which has three terminals to display time info of the bus leaving from station to passenger
in essence, the terminals which display the bus leaving time to passengers we consider it as an observer
in reality, The problem with the bus depo station is that it constantly changes its internal info states from 1 to some state
But, Why?
Because buses will come and go to their destination and its time of leaving buses changes constantly then how do we update all the terminals accurate information of buses?
in fact, the answer is, by using an observer design pattern through which we can attach and detach bus info on the terminal display and can notify
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
class Iterminal
{
public:
virtual void newUpdateShow(float Time) = 0;
};
class Busdepo :public Iterminal
{
string name;
float Time;
public:
Busdepo(string name)
{
this->name = name;
}
void newUpdateShow(float Time)
{
this->Time = Time;
cout << "Bus at "<< name << " Will leave at "<< Time << "\n";
}
};
class BusdepoOperationSubject
{
vector<Busdepo*> list;
vector<Busdepo*>::iterator itr;
public:
void AttachInfo(Busdepo *Busdepo)
{
list.push_back(Busdepo);
}
void DetachInfo(Busdepo *Busdepo)
{
list.erase(std::remove(list.begin(), list.end(),Busdepo ), list.end());
}
void notifyInfo(float Time)
{
for(vector<Busdepo*>::const_iterator iter = list.begin(); iter != list.end(); ++iter)
{
if(*iter != 0)
{
(*iter)->newUpdateShow(Time);
}
}
}
};
class UpdateTimeInfo : public BusdepoOperationSubject
{
public:
void Changetime(float Time)
{
notifyInfo(Time);
}
};
int main()
{
UpdateTimeInfo Display;
Busdepo Terminal1 ("Terminal 1");
Busdepo Terminal2 ("Terminal 2");
Busdepo Terminal3 ("Terminal 3");
Display.AttachInfo(&Terminal1 );
Display.AttachInfo(&Terminal2 );
Display.AttachInfo(&Terminal3 );
Display.Changetime(10.35);
Display.DetachInfo(&Terminal2 );
Display.Changetime(2.45);
return 0;
}
Output
Bus at Terminal 1 will leave at 10.35
Bus at Terminal 2 will leave at 10.35
Bus at Terminal 3 will leave at 10.35
Bus at Terminal 1 will leave at 2.35
Bus at Terminal 3 will leave at 2.35
Leave a Reply