GWT ValueListBox符合MVP

时间:2012-05-10 03:40:11

标签: gwt gwt-platform

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

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

class ViewDesktopImpl implements View {

  ValueListBox<Object> valueListBox
}

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

  1. 在我的View界面中有一个HasConstrainedValue getter,Presenter调用getHasConstrainedValue并填充它

  2. 在我的View界面中有一个setValues(List对象),Presenter调用view.setValues和ViewDesktopImpl处理填充valueListBox

  3. 我认为最好采取备选方案1我只想为此获得利弊 - 是的,这可能是一种主观模式,但我想得到一些其他意见和理由,关于哪个选项应该被采取以及它如何符合MVP标准。

2 个答案:

答案 0 :(得分:1)

我想你想将ListBox实现为MVP。查看David Chandler中的SelectOneListBox。如果你的问题与特定小部件无关,我会说有一个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();
}

答案 1 :(得分:1)

这是我如何做我的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);
  }
}

使用ListBox的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));