阅读MVP模式,我发现View和Presenter之间有两种通信模式:
-
View不知道Presenter,但是提供了实现
HasClickHandler
接口的UI控件,其中Presenter注册了它的事件处理程序。 -
View知道Presenter,特别是它知道Presenter中的handler方法名,例如,当View中的Submit按钮被点击时,视图调用Presenter中的
onSubmitButtonClicked()
公共方法。
我发现后者对于JUnit测试更容易,因为我可以直接模拟向Presenter提交事件。然而,我的理解是View不应该知道Presenter的存在。
解决这种权衡的第三种方法是让呈现者在视图的控件中注册事件处理程序,处理程序调用公共呈现者方法:public void bind() {
display.getSubmitButton().addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
onSubmitButtonClicked();
}
});
}
但是这会引入很多样板代码。
视图-呈现者通信的正确模式是什么?
我自己还在努力学习这些东西,但我现在的思考方式是这样的:
public interface View {
void registerMouseListener(MouseListener listener);
}
public class ViewImpl implements View {
SomeComponent component; // SomeComponent extends java.awt.Component
public void registerMouseListener(MouseListener listener) {
component.addMouseListener(listener);
}
}
然后您可以让Presenter
决定如何注册这些事件,通过添加匿名侦听器,或扩展MouseListener
本身等。