Ответ 1
Сам шаблон не определяет, как справиться с этим.
Мое собственное предпочтение - это центр сообщений/событий, где ведущие могут регистрировать интерес к определенным событиям. Он предотвращает появление сложных деревьев зависимостей и позволяет тестировщикам справляться.
Например:
class PresenterA
{
void HandleProductSelectionChanged(int productId)
{
EventHub.Publish(EventType.ProductChanged, productId);
}
}
class PresenterB
{
void PresenterB
{
EventHub.Register(EventType.ProductChanged, HandleProductChanged);
}
public void HandleProductChanged(object state)
{
var productId = (int)state;
var productDetails = LoadProductDetails(productId);
view.DisplayProductDetails(productDetails);
}
}
EventHub будет хранить список подписчиков для вызова для каждого типа события.
Вы сохраняете свою тестируемость - просто вызовите HandleProductChanged
, чтобы увидеть, как PresenterB будет отвечать на новый выбор продукта.
Единственным недостатком (как и для любого шаблона) является введение уровня косвенности. Если PresenterA напрямую вызвал PresenterB или PresenterB прослушал событие на PresenterA, сразу же стало очевидно, что произойдет.
В этом подходе у вас будет дополнительный шаг, видя EventType.ProductChanged, а затем найдя, какие докладчики зарегистрировали интерес к этому событию.
По моему собственному опыту, этот единственный уровень косвенности заслуживает модульности, которую вы получаете.