Created
February 5, 2020 22:58
-
-
Save ahsan2github/c3b725c7e696e1c6ee1f911eb75bdd31 to your computer and use it in GitHub Desktop.
Mediator pattern example in c++
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <set> | |
#include <memory> | |
struct Condition{ | |
int RoadHazard; | |
}; | |
class IMediator; | |
class ISubject; | |
class ISubject{ | |
public: | |
ISubject() = default; | |
~ISubject() = default; | |
virtual void sendMessage(std::shared_ptr<IMediator> mediator) = 0; | |
virtual void receiveMessage(const Condition& data) = 0; | |
}; | |
class IMediator{ | |
public: | |
IMediator() = default; | |
~IMediator() = default; | |
virtual void registerSub(std::shared_ptr<ISubject> subject) = 0; | |
virtual void notify(const Condition& data) = 0; | |
}; | |
class Mediator: public IMediator{ | |
public: | |
Mediator(); | |
~Mediator(); | |
virtual void registerSub(std::shared_ptr<ISubject> subject) override; | |
virtual void notify(const Condition& data) override; | |
private: | |
std::set< std::shared_ptr<ISubject> > registeredObjects; | |
}; | |
Mediator::Mediator(){ | |
// do nothing | |
} | |
Mediator::~Mediator(){ | |
// do nothing | |
} | |
void Mediator::registerSub(std::shared_ptr<ISubject> subject){ | |
if(registeredObjects.find(subject) == registeredObjects.end() ){ | |
registeredObjects.insert(subject); | |
} | |
} | |
void Mediator::notify(const Condition& data){ | |
std::cout << "Mediator notify method called " << std::endl; | |
for(std::shared_ptr<ISubject> x : registeredObjects){ | |
x->receiveMessage(data); | |
} | |
} | |
class SomeImpClass{ | |
public: | |
SomeImpClass() = default; | |
~SomeImpClass() = default; | |
virtual void funding(); | |
virtual void personnel(); | |
}; | |
void SomeImpClass::funding(){std::cout << "Funding being decided" << std::endl;} | |
void SomeImpClass::personnel(){std::cout << "persons assigned" << std::endl;} | |
class NationalParkService: public SomeImpClass, public ISubject{ | |
public: | |
NationalParkService(); | |
NationalParkService(const Condition indata); | |
~NationalParkService(); | |
virtual void sendMessage(std::shared_ptr<IMediator> mediator) override; | |
virtual void receiveMessage(const Condition& data) override; | |
Condition data; | |
}; | |
NationalParkService::NationalParkService() | |
{ | |
// do noting | |
} | |
NationalParkService::NationalParkService(const Condition indata): data{indata} | |
{ | |
std::cout << "initialized data (NationalParkService) " << this-> data.RoadHazard << std::endl; | |
} | |
NationalParkService::~NationalParkService(){ | |
// do noting | |
} | |
void NationalParkService::sendMessage(std::shared_ptr<IMediator> mediator){ | |
mediator->notify(this->data); | |
} | |
void NationalParkService::receiveMessage(const Condition& data){ | |
this->data = data; | |
} | |
class DepartmentTransportation: public SomeImpClass, public ISubject{ | |
public: | |
DepartmentTransportation(); | |
DepartmentTransportation(const Condition& indata); | |
~DepartmentTransportation(); | |
virtual void sendMessage(std::shared_ptr<IMediator> subject) override; | |
virtual void receiveMessage(const Condition& data) override; | |
Condition data; | |
}; | |
DepartmentTransportation::DepartmentTransportation() | |
{ | |
// do noting | |
} | |
DepartmentTransportation::DepartmentTransportation(const Condition& indata): data{indata} | |
{ | |
// do noting | |
} | |
DepartmentTransportation::~DepartmentTransportation(){ | |
// do noting | |
} | |
void DepartmentTransportation::sendMessage(std::shared_ptr<IMediator> mediator){ | |
mediator->notify(this->data); | |
} | |
void DepartmentTransportation::receiveMessage(const Condition& data){ | |
this->data = data; | |
} | |
int main(){ | |
std::shared_ptr<IMediator> mediator = std::make_shared<Mediator>(); | |
Condition pcond{10}; | |
std::shared_ptr<SomeImpClass> park = std::make_shared<NationalParkService>(pcond); | |
std::shared_ptr<SomeImpClass> trans = std::make_shared<DepartmentTransportation>(); | |
mediator->registerSub(std::dynamic_pointer_cast<ISubject>(park)); | |
mediator->aregisterSub(std::dynamic_pointer_cast<ISubject>(trans)); | |
std::dynamic_pointer_cast<ISubject>(park)->sendMessage(mediator); | |
std::cout << "trans->data.RoadHazard " << std::dynamic_pointer_cast<DepartmentTransportation>(trans)->data.RoadHazard << std::endl; | |
std::cout << "park->data.RoadHazard " << std::dynamic_pointer_cast<NationalParkService>(park)->data.RoadHazard << std::endl; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment