1) Presenter не должен зависеть от виджетов UI - для этого есть несколько причин:
- Разделение представления пользовательского интерфейса в представлениях и логики приложения в Presenter
- Определено в интерфейсах поведение View и Presenter
- Легко написать модульные тесты для слоя презентатора
- Несколько представлений (рабочий стол, мобильный телефон и т. Д.) Для одного докладчика
Простой набор интерфейсов с именем MVP позволяет нам разделить эти два слоя:
// View interface
interface View extends AsWidget {
void setPresenter(Presenter presenter); // cross reference to presenter
interface Presenter { // presenter must extends from this interface
void onContactEditClick(); // callback from view handling in presenter without any UI code
}
}
// View realization (part)
public class ViewImpl extends Composite implements View {
@UiHandler('someButton') // or 'somelink', e.t.c.
void onContactEditClick(ClickEvent event) {
presenter.onContactEditClick();
}
}
Ведущий изолирован от элементов управления, которые запускают события. Это может быть кнопка, может быть ссылка, e.t.c. Таким образом, можно создать несколько реализаций представлений (например, для настольных и мобильных платформ) с различным набором элементов управления пользовательским интерфейсом в каждом представлении и использовать эти представления с одним докладчиком.
Google MVP
2) Слушатели связаны с элементами управления пользовательского интерфейса. На мой взгляд, лучше избегать использования слушателей между представителем и докладчиком с помощью методов интерфейса, как в примере Point1. На самом деле интерфейс Presenter внутри интерфейса View является лучшим слушателем всех событий из представления.
3) То же самое. HasClickHanlers относится к слою View и должен быть отделен от презентатора.