Вы недостаточно раскрыли свой дизайн, чтобы дать нам точный ответ.Итак, позвольте мне предложить вам пару общих подходов, чтобы решить, какой из них (если таковой имеется) будет лучше работать в вашем случае.
Очевидным является двойная диспетчеризация , к которой вы склонныотбросить (не знаю почему):
EventAgg>>processEvent: anEvent
anEvent beProccessedWith: self
Discarded >> beProccessedWith: anEventAgg
anEventAgg processDiscardedEvent: self
EventAgg>>processDiscardedEvent: anEvent
self discard
Однако, прежде чем использовать этот шаблон, я хотел бы изучить другие способы сотрудничества, такие как:
EventAgg>>processEvent: anEvent
anEvent beProccessedWith: self
Discarded >> beProccessedWith: anEventAgg
anEventAgg discard
Этот второй подход создастбольше сплоченности, но может иметь смысл, если вы считаете, что для ваших объектов естественно выполнять командную работу.Более сложные события могут потребовать участия обоих объектов.Конечно, вам нужно будет уделять больше внимания при распределении обязанностей.В частности, я бы попытался избежать кода, в котором, скажем, Event
слишком много знает о внутренностях EventAgg
.Для этого пусть Event
делегирует определенные задачи EventAgg
, когда это необходимо.Что-то на линии
EventAgg>>processEvent: anEvent
anEvent beProccessedWith: self
ComplexEvent >> beProccessedWith: anEventAgg
anEventAgg
doThisUsing: self thisInformation;
doThatUsing: self thatInformation