Я только что внимательно изучил шаблон наблюдателя. И я написал демо-фрагмент, чтобы лучше это понять.
Но после того, как я только что закончил демо, возник вопрос: шаблон наблюдателя находится между одним наблюдаемым объектом и множеством наблюдателей. Как насчет того, что наблюдателю нужна информация из двух или более источников?
Вот демонстрационный код, написанный на 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++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение