Я оцениваю, могут ли события CDI иметь смысл для моего нового приложения. До сих пор я всегда работал с MVP
архитектурами, где View
имеет только элементы пользовательского интерфейса и предоставляет их в общедоступных геттерах, тогда как Presenter
регистрирует для них прослушиватели щелчков.
Я пришел к CDI Events
и подумал о том, чтобы запускать события щелчка в View
классах напрямую, и просто observe
эти события в моем Presenters
.
Не могли бы вы сказать мне, какой подход лучше? Или почему вы вообще предпочли бы один подход другому?
MVP:
class LoginView {
private Button loginButton;
public void getButton() {
return loginButton;
}
}
class LoginPresenter {
@Inject
private LoginView view;
public LoginPresenter() {
view.getButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
//perform the login business logic
}
});
}
}
События CDI:
class LoginView {
private Button loginButton;
@Inject
private Events<LoginEvent> events;
public LoginView() {
loginButton.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
events.fire(new LoginEvent("login"));
}
});
}
}
class LoginPresenter {
private void listenLogin(@Observes LoginEvent evt) {
//perform the login business logic
}
}
class LoginEvent extends EventObject {
public LoginEvent(String source) {
super();
}
}
(в этом примере используется Vaadin, но выбор фреймворка не имеет значения для моего вопроса в целом)
Для меня главное отличие: CDI не требует никаких геттеров для пользовательского интерфейса и никаких переменных-членов представления в презентаторе. С другой стороны, мне нужно создать дополнительный класс событий для каждого события, которое должно быть запущено.