MVP - 注册点击监听器还是使用CDI事件?

mem*_*und 0 java java-ee vaadin cdi

我正在评估CDI事件是否对我的新应用程序有意义.到目前为止,我总是使用MVP架构,其中View只有UI元素并在公共getter中公开它们,而Presenter寄存器点击它们上的监听器.

我来到这里CDI Events并考虑View直接在类中触发click事件,而只是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
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

(这个例子使用Vaadin,但框架选择对我的问题一般不重要)

对我来说,主要区别在于:CDI不需要UI的getter,也不需要Presenter中的视图成员变量.在缺点方面,我需要为每个要触发的事件创建一个额外的事件类.

Kim*_*m L 5

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

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