Model-View-Presenter中的Presenter是否会创建视图?

Tow*_*wer 30 theory mvp architectural-patterns

如何在MVP中创建视图?Presenter是否始终创建它们(除了子视图的视图外)?或者它是一个单独的第三方组件或应用程序或创建它们的东西?

我们还要补充一点,我可能会在Dojo Toolkit/ExtJS(即JavaScript)上执行此操作.

所以,我有这些代码行:

var v = new MyApp.view.User();
var p = new MyApp.presenter.User();
Run Code Online (Sandbox Code Playgroud)

这两条线应该在哪里准确?演示者是否实例化视图,反之亦然?什么实例化第一个实例?

Mar*_*ijn 46

这取决于 ...

MVP的主要目标是将复杂的决策逻辑与UI代码分开,使其变得更容易理解和维护.通常另一个目标是使演示者中的决策逻辑可测试.

Fowler在2004年描述了MVP模式,他在2006年通过将模式分为监督控制器(SC)和被动视图(PV)来退休.在SC中,View与模型绑定,但在PV中不绑定; 在PV中,View仅由Presenter直接更改.

在SC和PV中,Presenter必须更新视图并对用户对视图所做的更改做出反应,例如输入文本或按下按钮.当您在Presenter上使用View调用方法时,会出现您描述的问题,因为View需要对Presenter的引用,反之亦然.如果你这样做,你只需要决定谁开始它.选项包括:

  1. View创建Presenter的实例.加载视图时,它会在Presenter的初始化函数中将自身传递给Presenter.
  2. 反过来说:Presenter创建View并在View的初始化函数中将自身传递给View.
  3. 您将引入第三个对象,该对象同时创建View和Presenter,将它们连接在一起并初始化它们.

所有选项都可以让您实现关注点分离和决策逻辑可测性提高的"MVP目标".我不认为这些方法中的任何一种在理论上是正确的或错误的 - 您只需选择最适合您使用的技术的方法.并且最好在整个应用程序中保持一致.

  • 除了我的回答中的链接,我找到了[build-your-own-cab-series](http://codebetter.com/jeremymiller/2007/07/26/the-build-your-own-cab-series-目录/)很好地解释了MVP的不同风格.它特定于.NET. (2认同)

Nei*_*gan 6

这些是你的选择:

var cvp = new ContactViewPresenter(new ContactView());
Run Code Online (Sandbox Code Playgroud)

ContactViewPresenter构造函数集this.view = viewParam和集this.view.presenter = this.它将代码保留在Presenter中,它可以在必要时交换视图,并且可以通过模拟视图进行测试.

var cv = new ContactView(new ContactViewPresenter());
Run Code Online (Sandbox Code Playgroud)

ContactView构造函数集this.presenter = cvpParam,和this.presenter.view = this.View中的一些逻辑,但不是很多.如有必要,可以换出演示者.

ContactView cv = new ContactView();
ContactViewPresenter cvp = new ContactViewPresenter();
cv.presenter = cvp;
cvp.view = cv;
cv.init();
cvp.init();
Run Code Online (Sandbox Code Playgroud)

这是更多的代码.

ContactViewPresenter cvp = new ContactViewPresenter();
Run Code Online (Sandbox Code Playgroud)

构造函数创建集this.view = new ContactView()和this.view.presenter = this.

ContactView cv = new ContactView();
Run Code Online (Sandbox Code Playgroud)

构造函数集this.presenter = new ContactViewPresenter()和this.presenter.view = this

最后两个似乎有点太耦合了.

一个很好的是代码保留在Presenter中,似乎允许更容易的测试.

两个很好,因为你不必过多关心演示者,并且可以更多地担心你的观点.