Редактировать: я думаю, что у Dirkgently есть хороший момент, и что сообщения не должны знать, как обрабатывать себя. Поэтому описанный мной подход, при котором сообщения могут использоваться как фабрики, не очень хорошая идея. Я думаю, что абстрактная фабрика процессов может быть хорошим решением.
Используйте абстрактную фабрику для создания объекта, который может обрабатывать обработку, и вызывать его, используя полиморфизм. Эта фабрика может быть включена непосредственно в класс сообщений, или вы можете создать отдельный класс фабрики, который принимает тип сообщения в качестве параметра и возвращает соответствующий объект.
class Message {
public:
virtual Processor *getProcessor() = 0;
// other methods
};
class Processor {
public:
virtual void doWork() = 0;
};
class MyListener : Listener {
public:
void notify(Message *message);
};
void MyListener::notify(Message *message) {
Processor *proc = message->getProcessor();
proc->doWork();
};
(Извините, если это неверно. Мой C ++ немного слаб, но я считаю, что это иллюстрирует принцип.)
Это позволит вам просто переопределить getProcessor () для каждого типа сообщений и создать там соответствующий процессор.
IMVHO, Полиморфизм - это путь. Я предполагаю, что та логика обработки, которую вы хотите сделать, не относится к классу сообщений и должна быть перемещена в отдельные классы. Другая причина, по которой я бы предпочел этот подход, заключается в том, что он не требует от меня изменения структуры уведомляемого класса, если я добавляю дополнительные сообщения. Если существует только один или два типа сообщений, это может не быть проблемой.