Я занят добавлением универсального механизма наблюдателя в унаследованное приложение C ++ (используя Visual Studio 2010, но не использую .Net, поэтому о делегатах .Net не может быть и речи).
В проекте, который я хочумаксимально отделить специфичную для приложения часть от общего механизма наблюдателя.
Наиболее логичный способ реализации наблюдателей выглядит следующим образом:
class IDoThisObserver
{
public:
void handlDoThis(int arg1, int arg2) = 0;
};
Для каждого типа наблюдателя (IDoThisObserver), IDoThatObserver, ...) аргументы методов (handleDoThis, handleDoThat) различны.
Что остается в общем способе хранения наблюдателей, например:
template<typename T>
class ObserverContainer
{
public:
void addObserver (T &t) {m_observers.push_back(&t);}
private:
std::list<T*> m_observers;
};
ВызовНаблюдатель не может быть обобщен, так как аргументы различны для каждого типа наблюдателя.
Альтернативным способом было бы «упаковать» все аргументы в один аргумент, например:
struct DoThisInfo
{
DoThisInfo (int arg1, int arg2) : m_arg1(arg1), m_arg2(arg2) {}
int m_arg1;
int m_arg2;
};
А затем определите более общего наблюдателя, например, так:
template<typename T>
class IObserver
{
public:
void notify(const T &t) = 0;
};
И группа этих наблюдателей станет такой:
template<typename T>
class ObserverContainer
{
public:
void addObserver (IObserver<T> &obs) {m_observers.push_back(&obs);}
private:
std::list<IObserver<T>*> m_observers;
};
Нетw, гораздо больше логики может быть централизованно добавлено к этому ObserverContainer, включая вызов всех наблюдателей.«Инициатору» вызова нужно только создать и заполнить структуру уведомлений.
Классы, которые хотят наследовать от нескольких видов наблюдателей, должны сделать это так:
class MyObserver : public IObserver<NotifyThis>, public IObserver<NotifyThat>
{
...
};
* 1028Какой из этих подходов (наблюдатели с несколькими явными аргументами или с одним структурным аргументом) кажется лучшим?Есть ли какие-либо преимущества или недостатки у любого из этих подходов?
EDIT : Я посмотрел немного дальше к альтернативным подходам, и подход Slot / Signal кажется еще одним хорошим кандидатом.Есть ли какие-либо важные недостатки в слоте / сигнале, о которых мне следует знать?