демонстрация
екст и вопрос сначала, скелетный код внизу поста)
Мы создаем и внедряем среду C ++ для использования в таких средах, как Arduino.
Для этого я хочу использовать шаблон Observer, где любой компонент заинтересован в изменении состояния датчиков (Observables
) может зарегистрироваться, и он будет уведомлен об этих изменениях Наблюдательнойnotification()
Метод Обозревателя с самим собой в качестве параметра.
Один наблюдатель может наблюдать несколько наблюдаемых, и наоборот.
Проблема заключается в том, что наблюдателю необходимо извлечь текущее состояние наблюдаемой и что-то с ним сделать, и это текущее состояние может принимать все формы и размеры, в зависимости от конкретного датчика, который является наблюдаемой.
Конечно, это могут быть порядковые значения, которые являются конечными и могут быть закодированы, как я делал в коде ниже с методомgetValueasInt()
но это также могут быть специфичные для сенсора структуры, т. е. для RealTimeClock, который предоставляет структуру значений даты и времени. Структура, конечно, определяется во время компиляции и фиксируется для конкретного датчика.
Мой вопрос:Какое самое элегантное решение для будущего развития или образец для этого?
Редактировать: Обратите внимание, что конструкции dynamic_cast <> невозможны из-за ограничений Arduino
Я создал следующую иерархию классов (скелетный код):
class SenseNode
{
public:
SenseNode() {};
SenseNode(uint8_t aNodeId): id(aNodeId) {}
virtual ~SenseNode() {}
uint8_t getId() { return id; };
private:
uint8_t id = 0;
};
class SenseStateNode : virtual public SenseNode
{
public:
SenseStateNode(uint8_t aNodeId) : SenseNode(aNodeId) {}
virtual ~SenseStateNode() {}
/** Return current node state interpreted as an integer. */
virtual int getValueAsInt();
};
class SenseObservable: public SenseStateNode
{
public:
SenseObservable(uint8_t aNodeId);
virtual ~SenseObservable();
/** Notify all interested observers of the change in state by calling Observer.notification(this) */
virtual void notifyObservers();
protected:
virtual void registerObserver(SenseObserver *);
virtual void unregisterObserver(SenseObserver *);
};
class SenseObserver: virtual public SenseNode
{
public:
SenseObserver() {};
virtual ~SenseObserver();
/** Called by an Observable that we are observing to inform us of a change in state */
virtual void notification(SenseObservable *observable) {
int v = observable->getValueAsInt(); // works like a charm
DateTime d = observable-> ???? // How should i solve this elegantly?
};
};