Я сталкивался с той же проблемой в нескольких различных приложениях GWT, которые я разработал с использованием подхода Рэя Райана.
Мое предпочтительное решение состоит в том, чтобы создать синглтонский «объект сеанса», который хранит состояние этой части приложения. В вашем примере это может выглядеть так:
interface EditPersonSession {
void fetchPerson(PersonId id);
PersonDetails getCurrentPersonDetails();
void updatePersonDetail(PersonDetail<?> detail);
void updatePetDetail(PetDetail<?> detail);
void updateAddressDetail(AddressDetail<?> detail);
void save();
}
Все три докладчика содержат ссылку на объект сеанса (возможно, введенный Джином). Всякий раз, когда пользователь манипулирует пользовательским интерфейсом (представлением), презентатор, связанный с этим представлением, немедленно передает состояние общему объекту сеанса. Например, внутри EditAddressPresenter:
view.getStreetNameTextBox().addValueChangeHandler(new ValueChangeHandler() {
void onValueChange(ValueChangeEvent<String> event) {
editPersonSession.updateAddressDetail(new StreetNameAddressDetail(event.getValue()));
}
}
Когда приходит время сохранения, объекту состояния предписывается сохранить состояние на сервере. На этом этапе объект сеанса имеет новейшие представления данных и может сохранить их все сразу. Итак, в EditPersonPresenter:
view.getSaveButton().addClickHandler(new ClickHandler() {
void onClick(ClickEvent event) {
editPersonSession.save();
}
}
Таким образом, докладчики не должны содержать никаких ссылок друг на друга, но могут отправлять согласованную информацию на сервер.
Если докладчикам необходимо знать, когда информация, которую они отображают, была обновлена (либо другими докладчиками, либо сервером), объект сеанса может уведомить их, запустив события на шине событий (совместно используемый Singleton HandlerManager). Затем докладчики могут извлечь самые последние данные PersonDetails из объекта сеанса.