MVP:View应该实现Presenter的界面,反之亦然?

时间:2010-07-22 12:56:34

标签: java gwt mvp gwt-mvp

我正在使用GWT执行我的第一步。 我看完后有一个问题:

在第一个示例中,Presenter定义了View的接口。

public class ContactsPresenter implements Presenter {
  ...
  public interface Display extends HasValue<List<String>> {
    HasClickHandlers getAddButton();
    HasClickHandlers getDeleteButton();
    HasClickHandlers getList();
    void setData(List<String> data);
    int getClickedRow(ClickEvent event);
    List<Integer> getSelectedRows();
    Widget asWidget();
  }
}

在第二个中,View定义了Presenter的界面。

public interface ContactsView<T> {

  public interface Presenter<T> {
    void onAddButtonClicked();
    void onDeleteButtonClicked();
    void onItemClicked(T clickedItem);
    void onItemSelected(T selectedItem);
  }

  void setPresenter(Presenter<T> presenter);
  void setColumnDefinitions(List<ColumnDefinition<T>> columnDefinitions);
  void setRowData(List<T> rowData);
  Widget asWidget();
}

这种差异的想法是什么?

我应该选择哪个?

3 个答案:

答案 0 :(得分:2)

我认为你应该在你的问题中使用'定义'这个词而不是'implements',如果是这样的话,那么哪个类定义接口并不重要。

您可以通过在自己的文件中定义接口来做一些不同的事情。最重要的是Presenter实现Presenter界面和View实现View界面。

答案 1 :(得分:2)

@deepak这些都是有效的顾虑。 Word是感染实现而不是定义。

让我解释一下。在第一个示例中,演示者将合同保持在视图必须实现的位置,换言之,驱动视图应该通过经典MVP方法实现的内容。

第二个例子让事情变得混乱。 Presenter无法控制必须实现的视图。这不是MVP,谷歌称之为MVP。使用此方法无法使用JRE /单元测试来测试视图。虽然不是MVP和谷歌不应该调用这个MVP,或者他们必须解释为什么它是一个MVP,这并不会让它变坏?

@Saket Bansal分离界面是不正确的方法。随着应用程序的增长,它将导致难以维护的代码。

在我看来,你可以采取任何一种方法,我记得谷歌说一些第一个为他们工作的adwords和第二个为wave。

你应该如何看待像GWTP这样的framworks或者来自jboss的ERRAI

答案 2 :(得分:0)

在第二个教程中,代码更改为使用Presenter接口(在视图中定义)以适应使用UiBinders和Java泛型。我认为Presenter界面已移至View界面,因为它们共享相同的通用T。