#include <memory>
#include <list>
#include <iostream>
struct Notification
{
virtual ~Notification()
{
}
virtual void process() = 0;
};
class SubscriberA: public Notification
{
public:
//Notification
virtual void process()
{
std::cout << "A
";
}
};
class SubscriberB: public Notification
{
public:
//Notification
virtual void process()
{
std::cout << "B
";
}
};
class Publisher
{
std::list<std::shared_ptr<Notification>> _listSubscribers;
public:
void subscribeForNotification(std::shared_ptr<Notification> subscriber)
{
if (!subscriber)
{
return;
}
auto it = _listSubscribers.begin();
while (it != _listSubscribers.end())
{
if (*it == subscriber)
{
return;
}
++it;
}
_listSubscribers.push_back(subscriber);
}
void start()
{
notifySubscribers();
}
private:
void notifySubscribers()
{
for (auto it = _listSubscribers.begin(); it != _listSubscribers.end(); ++it)
{
(*it)->process();
}
}
};
int main()
{
Publisher p;
p.subscribeForNotification(std::shared_ptr<Notification>(new SubscriberA()));
p.subscribeForNotification(std::shared_ptr<Notification>(new SubscriberB()));
p.start();
return 0;
}