gpt4 book ai didi

java - MVP - 注册点击监听器或使用 CDI 事件?

转载 作者:行者123 更新时间:2023-12-01 07:08:05 25 4
gpt4 key购买 nike

我正在评估 CDI 事件对我的新应用程序是否有意义。到目前为止,我一直使用 MVP 架构,其中 View 仅具有 UI 元素并在公共(public) getter 中公开它们,而 Presenter 注册点击监听器在他们身上。

我想到了 CDI Events 并考虑直接触发 View 类中的点击事件,并且只是简单地观察这些事件我的演示者

您能告诉我哪种方法更好吗?或者为什么您通常会选择其中一种而不是另一种方法?

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 Activity :

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 不需要 UI 的 getter,也不需要 Presenter 中的 View 成员变量。缺点是,我需要为每个要触发的事件创建一个额外的事件类。

最佳答案

就我个人而言,我不使用 CDI 事件将事件从 View 发送到其呈现器。演示者和 View 相互直接引用,这意味着与直接方法调用相比,CDI 事件只会导致额外的开销(代码和性能方面)。当您想要解耦代码时,CDI 事件非常有用,例如,它们非常适合跨 View 通信。

作为旁注,我倾向于将所有 com.vaadin 导入远离演示者,这在您的情况下意味着 View 将实现 ClickListener 并且演示者将具有诸如 loginButtonClicked() 之类的方法 -当 ClickEvent 发生时, View 将调用该方法。这样我就可以更改 View 的实现而不影响演示者。如果您认为这是好还是坏做法,这可能是一个品味问题。通常,对这种方法的辩护是,保持演示者不受 View 实现特定技术的影响,即使在使用另一种技术实现 View 时,我们也可以重复使用演示者,但我认为这是相当学术性的。我得到的好处是,在为演示者进行单元测试时,我不需要模拟 Vaadin 组件。

关于java - MVP - 注册点击监听器或使用 CDI 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19081413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com