прошу прощения за все и вся новизна),
У меня есть следующая задача:
У меня есть несколько классов (назовите их А), которые постоянно собирают информацию из различных источников (базы данных, Интернета и т. Д.). Они могут содержать потенциально большой объем информации по какой-либо теме.
У меня также есть группа классов (назовите их B), которые позволяют мне отображать различные графики, если они снабжены достаточным количеством информации (здесь информация может быть такой же простой, как одно или несколько плавающих значений).
Теперь я должен связать эти две вещи вместе, чтобы я мог изменить, какая информация отображается в какой форме с минимальными изменениями. Теперь я рассматриваю возможность использования паттерна наблюдателя здесь, потому что он, похоже, прекрасно подходит для этой проблемы. Тем не менее, я немного застрял и хотел бы совет. Я могу четко сделать классы базового типа «источник данных», который позволяет подписчикам и уведомляет подписчиков, когда происходят изменения. Я также могу сделать классы B типа «наблюдатель» и позволить им подписываться на источники данных и получать уведомления об изменениях.
Проблема в том, что я не хочу, чтобы мои наблюдатели знали какую-либо конкретную информацию, которую они отображают. Например, если я хочу изобразить температуру в моем городе по оси Y и время по оси X, и у меня есть класс 2D-графика (типа B), тогда я хочу избежать любого вида A->GetTemperature ()
звонки. Точно так же, в классе А я не хочу звонить NotifyOfTemperatureChange ()
или что-то подобное ...
Одна идея состоит в том, чтобы определить группу перечислений или строк, таких как "temperature"
, "time"
, "humidity"
и т. Д., А затем сообщить наблюдателю, что он должен слушать (что-то вроде A->SetYAxis (B, "temperature")
- здесь, я ' m информируя класс A, что он должен получить одно значение с плавающей запятой для своей оси Y из источника данных B, канал "температура")
, чтобы А мог просто сделать B->subscribeTo (whateverIPassedIn)
. Таким образом, B не нужно знать, какую информацию он готовит. А может тогда сказать notifyOfChangesOnThisChannel ("temperature")
. Это, однако, кажется мне немного хакерским ... Например, будут ли данные фактически переданы в уведомленную функцию? Должен ли я сделать что-то вроде этого:
void B::subscriberChanged (int subscriberId, std::string channel)
{
float value = datasource [subscriberId].GetCurrentValue (channel);
}
или было бы что-то вроде
void B::subscriberChanged (int subscriberId, std::string channel, void *data)
{
float value = *static_cast <float *> (data);
}
и кроме того, как B узнает тип данных? Я имею в виду в этом примере это число с плавающей точкой, но что, если это int или double?
Наверное, мой вопрос: это правильно? Есть ли лучший способ решить эту проблему?
Заранее спасибо