2012-05-10 78 views
0

我想弄清楚哪一个更符合MVP模式。GWT ValueListBox符合MVP

让我ViewDesktopImpl班说,我有以下代码:

class ViewDesktopImpl implements View { 

    ValueListBox<Object> valueListBox 
} 

现在,这里就是我想知道。难道更有意义,做到以下几点:

  1. 有一个HasConstrainedValue吸在我看来界面,演示调用getHasConstrainedValue和填充它

  2. 在我看来接口有一个setValues方法(List对象),演示调用view.setValues和ViewDesktopImpl处理填充valueListBox

我相信这将是更好地利用选项1我只想得到这个优点和缺点 - 是它可能是一个主观PATT恩,但我想得到一些其他的意见和理由,应该采取哪种选择,以及它如何符合MVP标准。

回答

1

我想你想实现列表框为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

这里是我该怎么办我的MVP。

让我的演示者在我的视图中调用getter的Instad我有我的视图调用演示者的方法。这样,业务逻辑就与主持人隔离开来,并且无需嘲笑视图即可轻松进行测试。

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

    interface Presenter { 
    void handleObjectSelected(Object object); 
    } 
} 

主讲实现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 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()); 
    } 
    ... 
} 

这样你:使用列表框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); 
    } 
} 

第2实施例不需要模拟您的视图来测试演示者逻辑。

相反的:

@Mock 
MyView view; 

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

你会测试你的演讲逻辑:

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