Есть вот такая архитектура на моем текущем проетке.
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 объект? Как вы считаете, как сделать это в рамках данной архитектуры более правильно?

