Обычно, когда я вижу учебники о шаблоне наблюдателя, я вижу уникальный метод, называемый notify
, но мне интересно. Что делать, если у меня есть разные методы, которые могут быть вызваны в разные моменты, но нужно сообщить другим, когда это произойдет? Как события, я делаю это неправильно? или все еще начинать шаблон наблюдателя?Все еще шаблон наблюдателя?
#include <iostream>
#include <algorithm>
#include <vector>
class Observer
{
public:
virtual void notifyBefore() = 0;
virtual void notifyAfter() = 0;
};
class Subject
{
public:
void attachObserver(Observer * observer)
{
observers.push_back(observer);
}
void detachObserver(Observer * observer)
{
auto index = std::find(observers.begin(), observers.end(), observer);
if (index != observers.end())
{
observers.erase(index);
}
}
virtual void notifyBefore()
{
for (auto current : observers)
{
current->notifyBefore();
}
}
virtual void notifyAfter()
{
for (auto current : observers)
{
current->notifyAfter();
}
}
private:
std::vector<Observer *> observers;
};
class ConcreteObserver : public Observer
{
public:
void notifyBefore()
{
std::cout << "You called me before..." << std::endl;
}
void notifyAfter()
{
std::cout << "You called me after..." << std::endl;
}
};
class ConcreteSubject : public Subject
{
public:
};
int main()
{
auto subject = new ConcreteSubject;
subject->attachObserver(new ConcreteObserver);
subject->notifyBefore();
for (int i = 0; i < 5; ++i)
std::cout << i << std::endl;
subject->notifyAfter();
}
По-моему, это по-прежнему реализация шаблона Observer. Кажется, это довольно простой пример Observer для меня – mdw7326
Имена методов не важны. это «шаблон», который имеет значение, т.е. расположение объектов и классовая структура. – Galik
Как вы думаете, что вы думаете о том, что это не шаблон наблюдателя? :) Связывание там, шаблон есть! – zar