当超越RAD (拖放和配置)构建用户界面的方式时,许多工具鼓励您可能会遇到三种设计模式,称为模型 - 视图 - 控制器 , 模型 - 视图 - 展示器和模型 - 视图 - 视图模型 。我的问题有三个部分:
在MVP 中 ,Presenter 包含 View 的 UI 业务逻辑。 View 中的所有调用都直接委托给 Presenter。 Presenter 也直接与 View 分离,并通过界面与之对话。这是为了允许在单元测试中模拟 View。 MVP 的一个常见属性是必须进行大量的双向调度。例如,当有人单击 “保存” 按钮时,事件处理程序将委托给 Presenter 的 “OnSave” 方法。保存完成后,Presenter 将通过其界面回调 View,以便 View 可以显示保存已完成。
MVP 往往是在 Web 窗体中实现单独呈现的非常自然的模式。原因是 View 总是首先由 ASP.NET 运行时创建。您可以找到有关这两种变体的更多信息 。
被动视图:视图尽可能愚蠢,几乎没有逻辑。演示者是一个与视图和模型对话的中间人。视图和模型完全相互屏蔽。模型可能会引发事件,但 Presenter 会订阅它们以更新视图。在 Passive View 中没有直接数据绑定,而 View 公开了 Presenter 用于设置数据的 setter 属性。所有状态都在 Presenter 中管理,而不是 View。
监督控制器:演示者处理用户手势。 View 直接通过数据绑定绑定到 Model。在这种情况下,Presenter 的工作是将 Model 传递给 View,以便它可以绑定到它。 Presenter 还将包含手势逻辑,如按下按钮,导航等。
在MVC 中 ,Controller 负责确定响应任何操作(包括应用程序加载时)显示哪个视图。这与 MVP 不同,其中操作通过 View 路由到 Presenter。在 MVC 中,View 中的每个操作都与对 Controller 的调用以及操作相关联。在网络中,每个动作都涉及对 URL 的调用,在 URL 的另一侧有一个 Controller 响应。控制器完成处理后,将返回正确的视图。在整个应用程序的生命周期中,序列以这种方式继续:
Action in the View -> Call to Controller -> Controller Logic -> Controller returns the View.
MVC 的另一个重要区别是 View 不直接绑定到 Model。视图简单地呈现,并且完全是无状态的。在 MVC 的实现中,View 通常在后面的代码中没有任何逻辑。这与 MVP 完全相反,因为如果 View 没有委托给 Presenter,它将永远不会被调用。
要看的另一种模式是Presentation Model模式。在这种模式中没有 Presenter。相反,View 直接绑定到 Presentation Model。 Presentation Model 是专为 View 设计的模型。这意味着该模型可以公开一个永远不会放在域模型上的属性,因为它会违反关注点分离。在这种情况下,表示模型绑定到域模型,并可以订阅来自该模型的事件。 View 然后订阅来自 Presentation Model 的事件并相应地更新自身。 Presentation Model 可以公开视图用于调用操作的命令。这种方法的优点在于,您可以完全删除代码隐藏,因为 PM 完全封装了视图的所有行为。此模式非常适合在 WPF 应用程序中使用,也称为Model-View-ViewModel 。
我前段时间在博客上发帖 ,引用了托德 · 斯奈德关于两者之间差异的优秀帖子 :
以下是模式之间的主要区别:
MVP 模式
- 视图与模型更加松散耦合。演示者负责将模型绑定到视图。
- 更容易进行单元测试,因为与视图的交互是通过接口进行的
- 通常一对一地查看演示者地图。复杂视图可能有多个演示者。
MVC 模式
- 控制器基于行为,可以跨视图共享
- 可以负责确定要显示的视图
这是我能找到的网上最好的解释。
这是对这些设计模式的许多变体的过度简化,但这就是我喜欢考虑两者之间差异的方式。
MVC
MVP