Я только что внимательно изучил шаблон наблюдателя. И я написал демо-фрагмент, чтобы лучше это понять.
Но после того, как я только что закончил демо, возник вопрос: шаблон наблюдателя находится между одним наблюдаемым объектом и множеством наблюдателей. Как насчет того, что наблюдателю нужна информация из двух или более источников?
Вот демонстрационный код, написанный на 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
Вопрос о шаблоне наблюдателя. Как насчет того, что наблюдателю нужна информация из двух или более источников? ⇐ C++
Программы на C++. Форум разработчиков
1713685238
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
Подробнее здесь: [url]https://stackoverflow.com/questions/78358701/question-about-observer-pattern-how-about-there-is-an-observer-need-information[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия