#include<iostream>
#include<vector>
#include<string>
#include <algorithm>
class ISubscriber {
public:
virtual void update() = 0;
};
class Publisher {
std::vector<ISubscriber*> m_subscriberList;
public:
virtual void registerSubscriber(ISubscriber& subscriber) {
m_subscriberList.push_back(&subscriber);
}
virtual void unregisterSubscriber(ISubscriber& subscriber) {
m_subscriberList.erase(std::remove(begin(m_subscriberList), end(m_subscriberList), &subscriber), end(m_subscriberList));
}
virtual void notifySubscribers() {
for (auto subscriber : m_subscriberList) {
subscriber->update();
}
}
};
class UpdateManager : public Publisher {
int m_baudRate;
int m_aspectRatio;
int m_volumeLevel;
public:
UpdateManager() : m_baudRate(0), m_aspectRatio(0), m_volumeLevel(0) {}
virtual void setBaudRate(int newBaudRate) {
m_baudRate = newBaudRate;
notifySubscribers();
}
virtual void setAspectRatio(int newAspectRatio) {
m_aspectRatio = newAspectRatio;
notifySubscribers();
}
virtual void setVolumeLevel(int newVolume) {
m_volumeLevel = newVolume;
notifySubscribers();
}
int getBaudRate() const { return m_baudRate; }
int getAspectRatio() const { return m_aspectRatio; }
int getVolumeLevel() const { return m_volumeLevel; }
};
class UpdateReceiver : public ISubscriber {
UpdateManager& m_manager;
public:
UpdateReceiver(UpdateManager& manager) : m_manager(manager) {
m_manager.registerSubscriber(*this);
}
virtual void update() {
// Process the new values
std::cout << m_manager.getBaudRate() << std::endl;
std::cout << m_manager.getAspectRatio() << std::endl;
std::cout << m_manager.getVolumeLevel() << std::endl;
}
};
int main() {
UpdateManager manager;
UpdateReceiver receiver(manager);
manager.setBaudRate(5);
return 0;
}