Вопрос о шаблоне наблюдателя. Как насчет того, что наблюдателю нужна информация из двух или более источников?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Вопрос о шаблоне наблюдателя. Как насчет того, что наблюдателю нужна информация из двух или более источников?

Сообщение Anonymous »

Я только что внимательно изучил шаблон наблюдателя. И я написал демо-фрагмент, чтобы лучше это понять.
Но после того, как я только что закончил демо, возник вопрос: шаблон наблюдателя находится между одним наблюдаемым объектом и множеством наблюдателей. Как насчет того, что наблюдателю нужна информация из двух или более источников?
Вот демонстрационный код, написанный на C++, чтобы вы лучше поняли мой вопрос (обратите внимание на мой комментарий в коде). фрагмент ниже):
#include
#include
#include
#include

class IObserver;

class IObservable
{
public:
virtual void add(IObserver*) = 0;
virtual void remove(IObserver*) = 0;
virtual void trigger() = 0;
virtual double get_temperature() = 0;
virtual ~IObservable() = default;
};

class IObserver
{
public:
IObserver(IObservable& observable):m_observable(observable){}
virtual void update() = 0;
virtual ~IObserver() = default;
protected:
IObservable& m_observable;
};

class IDisplay
{
public:
virtual void display() = 0;
virtual ~IDisplay() = default;
};

class WeatherStation : public IObservable
{
public:
void add(IObserver* observer_ptr) override
{
if(std::find(m_observer_list.begin(), m_observer_list.end(), observer_ptr) == m_observer_list.end())
{
m_observer_list.push_back(observer_ptr);
}
}

void remove(IObserver* observer_ptr) override
{
m_observer_list.erase(std::remove(m_observer_list.begin(), m_observer_list.end(), observer_ptr), m_observer_list.end());
}

void trigger()
{
for(const auto& observer:m_observer_list)
{
observer->update();
}
}

double get_temperature()
{
return m_temperature;
}

void set_temperature(double temperature)
{
m_temperature = temperature;
trigger();
}

virtual ~WeatherStation() = default;
private:
std::list m_observer_list;
double m_temperature;
};

class CommonDisplay:public IObserver, public IDisplay
{
public:
CommonDisplay(IObservable& observable):IObserver(observable){}

virtual ~CommonDisplay() = default;

void update() override
{
display();
}

};

class PhoneDisplay:public CommonDisplay
{
public:
PhoneDisplay(IObservable& observable, const std::string& name): m_name(name),CommonDisplay(observable){}

void display() override
{
std::cout

Подробнее здесь: https://stackoverflow.com/questions/783 ... nformation
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Ограниченный доступ в интерфейсе «Субъект» в шаблоне наблюдателя.
    Anonymous » » в форуме JAVA
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Ограниченный доступ в интерфейсе «Субъект» в шаблоне наблюдателя.
    Anonymous » » в форуме JAVA
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Ограниченный доступ в интерфейсе «Субъект» в шаблоне наблюдателя.
    Anonymous » » в форуме JAVA
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • DagBased ChangeManager в шаблоне наблюдателя
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Возможно ли в шаблоне Mako для импорта объектов из блока Python/Module в другом шаблоне Mako?
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»