Есть вот такая архитектура на моем текущем проетке.
class WebsocketsStream {
};
class Data {
};
class Configuration {
};
class DeviceDataListener {
};
class BaseDeviceListener {
virtual void receive_data(Data* data) = 0;
virtual void receive_processed_data(Data* data) = 0;
};
class DataReceiverDevice {
public:
void register_data_listener(BaseDeviceListener* data_listener);
};
class DeviceListener;
class Device {
public:
Device(DataReceiverDevice* dd) : dd_(dd), device_listener_(new DeviceListener(dd)) { dd_->register_data_listener(device_listener) }
void receive_processed_data(Data* data) {
for (auto &listener : device_listeners_) {
listener->receive_processed_data(data);
}
}
void receive_data(Data* data) {
for (auto &listener : device_listeners_) {
listener->receive_data(data);
}
}
private:
DataReceiverDevice* dd_;
DeviceListener* device_listener_;
std::vector<std::shared_ptr<DeviceDataListener>> device_listeners_;
};
class DeviceListener : public BaseDeviceListener {
public:
void receive_data(Data* data) { device_->receive_data(data);
void receive_processed_data(Data* data) { device_->receive_processed_data(data);
}
DeviceListener(Device* device) : device_(device) {}
private:
Device* device_;
};
class OscOutputConfiguration : public Configuration {
private:
Device* device_;
};
class LocalFileOutputConfiguration : public Configuration {
private:
Device* device_;
};
class WebsocketsOutputConfiguration : public Configuration {
private:
Device* device_;
WebsocketsStream* w_stream;
};
Есть Device класс, который получает данные от DataReceiverDevice с помощью обсервер паттерна у которого есть выходные конфигурации: одна для записи данных в файл, вторая для посылки данных на другой девайс через блютуз.
У класса Device мы регистрируем listener с помощью метода register_data_listener() для DataReceiverDevice и мы оттуда получаем данные вызывая метод receive_data(). Также у девайса есть вектор слушателей который отправляет данные наверх. Когда класс Device получает данные он их отправляет всем листенерам.
Мне понадобилось сделать дополнительную конфигурацию WebsocketsOutputConfiguration чтобы отправлять данные по вебсокетам и принимать уже обработанные данные. Эта конфигурация как входная так и выходная.
И вот сейчас я в раздумьях как мне достучаться до Device объекта из WebsocketsStream, чтобы вызвать его методы о получении данных и соответсвенно обновлять всех listener'ов. Можно передать тот же device_listener_ который у нас есть уже в классе Device ниже по иерархии, он уже содержит ссылку на девайс в себе и можно дернуть скажем новый метод receive_processed_data? Просто каждая конфигурация уже содержит в себе Device объект? Как вы считаете, как сделать это в рамках данной архитектуры более правильно?
architecture, c++, inheritance