GWT ValueListBox conform to MVP



我试图找出其中哪一个更符合MVP模式。

假设在我的 ViewDesktopImpl 类中,我有以下代码:

class ViewDesktopImpl implements View {
  ValueListBox<Object> valueListBox
}

现在,这就是我想知道的。 执行以下操作是否更有意义:

  1. 在我的视图界面中有一个 HasConstrainedValue getter,演示者调用 getHasConstrainedValue 并填充它

  2. 在我的视图界面中有一个setValues(List对象),演示器调用view.setValues,ViewDesktopImpl句柄填充valueListBox。

我相信最好采取选项 1 我只想了解这一点的利弊 - 是的,这可能是一种主观模式,但我想获得一些其他意见和理由,关于应该采取哪个选项以及它如何符合 MVP 标准。

我想你想将ListBox实现为MVP。查看 选择一个列表框 从 David Chandler .如果您的问题与特定的小部件无关,我会说拥有一个getter和一个setter是一个很好的方法。查看HasText界面。

在测试演示器时,您将模拟视图以使用以下Mockito设置测试数据:

@Mock
MyView view;
List testValues = ...;
when(view.getValues().getValues()).thenReturn(testValues);
result = presenter.method(...);
assertTrue(result == expected);

视图定义为:

public interface MyView extends View {
  HasValueList getValues();
}
public interface HasValueList {
  void setValues(List objects);
  List getValues();
}

以下是我做 MVP 的方式。

在我的视图中,让我的演示者调用getter,我的观点调用我的演示者的方法。这样,业务逻辑就与演示者隔离,并且无需模拟视图即可轻松测试。

public interface MyView extends View {
  void setObjectsList(List<Object> objects);
  void setPresenter(Presenter presenter);
  interface Presenter {
    void handleObjectSelected(Object object);
  }
}
Presenter

实现 MyView.Presenter:

class MyPresenter implements MyView.Presenter {
  private final MyView myView;
  private List<Object> objects;
  public MyPresenter(MyView myView, List<Objects> objects) {
    this.myView = myView;
    this.objects = objects;  
  }
  public void initialize() {
    myView.setPresenter(this);
    myView.setObjectsList(objects);
  }
  @Override
  public void handleObjectSelected(Object object) {
    // Do something with selected object.
  }
}

MyView 实现示例:

class MyViewImpl implements MyView {
  private Presenter presenter;
  ...
  @Override
  public void setObjectsList(List<Object> objects) {
    // Do something with object list.
  }
  @Override
  public void setPresenter(Presenter presenter) {
    this.presenter = presenter;
  }
  public void somethingHappened() {
    presenter.handleObjectSelected(object);
  }
}

使用列表框的 MyView 的第二个实现示例:

class ListBoxMyViewImpl implements MyView {
  @UiField ListBox listBox;
  private Presenter presenter;
  private List<Object> objects;
  public MyListBoxView() {
    objects = Lists.newArrayLists();
  }
  @Override
  public void setObjectsList(List<Object> objects) {
    this.objects = objects; 
    listBox.clear();
    for (Object object : objects) {
      listBox.addItem(object.toString());
    }
  }
  @Override
  public void setPresenter(Presenter presenter) {
    this.presenter = presenter;
  }
  @UiHandler("listBox")
  void onChange(ChangeEvent e) {
    presenter.handleObjectSelected(objects.get(listBox.getSelectedIndex());
  }
  ...
}

这样,您无需模拟视图即可测试演示器逻辑。

而不是:

@Mock
MyView view;
List testValues = ...;
when(view.getValues().getValues()).thenReturn(testValues);
result = presenter.method(...);
assertTrue(result == expected);

您将测试演示器逻辑:

List testValues = ...;
assertEquals(expected, presenter.method(testValues));

相关内容

  • 没有找到相关文章

最新更新