MVP正确的遏制方向?

时间:2012-03-31 12:36:15

标签: gwt mvp

我已经查看了一些关于MVP模式的不同示例,我发现了它的各种实现。我不清楚哪一个应该包含另一个:视图还是演示者?

顾名思义:

public MyPresenter(){
   display = new MyView(this);
}

或作为我理智的逻辑(以及关于MVP的wikipedia页面)

public MyView(){
   presenter = new MyPresenter(this);
}

或者我应该使用完全不同的方法来创建这些对象吗?

2 个答案:

答案 0 :(得分:5)

DOM是浏览器中成本最高的东西之一,因此构建小部件在GWT中成本很高。相反,主持人通常很便宜,所以他们可以随意进行破坏和重建。

这就是为什么我建议尝试在许多演示者中重复使用您的观点(让它们单独或缓存几分钟)作为经验法则。

这意味着您(短命的)演示者应该引用您的(长寿命)视图。

我非常相信依赖注入,所以我不会在另一个内部实例化。这极大地有助于管理组件的生命周期,每个组件都独立于另一个组件 因此,您将视图注入演示者:创建演示者,选择视图(创建视图或从缓存获取视图)并将其提供给演示者。然后你将销毁演示者并保持视图在下次需要时重复使用(与另一个演示者)。

答案 1 :(得分:2)

使用MVP模式的一个主要原因是在Presenter中隔离您的逻辑,以便对其进行单元测试。

如果你这样做:

public MyPresenter(){
   display = new MyView(this);
}

如果没有扩展GWTTestCase,您将无法对演示者进行单元测试。 所以我更喜欢:

 public MyPresenter(MyViewInterface view){
     this.view = view;
 }

MyView实现MyViewInterface的位置。可以使用真正的MyView实现插入接口,也可以使用不需要启动GWT上下文进行测试的测试实现。