您的位置:首页 > 其它

MVP (Model-View-Presenter) 模式 [翻译]

2007-09-20 20:37 369 查看
问题

一个智能客户端应用程序中的窗体经常包含各种控件,处理用户事件,包含逻辑来改变控件以响应这些事件。在窗体类中编写这些代码,将使整个类趋于复杂,同时难以测试。此外,在窗体间互相共享和调用具有相同行为的代码也变得非常困难。

解决方案

将显示和事件控制行为进行职责分离,将他们放入不同的类中。一个叫做 View (视图) 的类管理窗体上的控件,它将事件传递给一个叫 Presenter (展示器) 的类,Presenter包含事件响应的逻辑,然后处理 View 的状态。这个 Presenter 类通过 Model (模型) 来决定如何响应事件(应用程序的状态经常由 Business Entity (业务实体) 展现)。

这个方案可以将职责分离,并允许你在不通过界面的方式下进行测试。

逻辑视图



Figure 1

MVP pattern logical view

Model 包含业务数据,比如 Business Entity 数据,Model 不知道 Presenter 改变了状态。View 包含一个对 Presenter的引用,并且委托 Presenter 处理用户事件,但 View 中并不包含业务逻辑。Presenter 不引用具体的 View,它仅仅应用一个 View 的接口Iview。通过这种方式,你可以简单地替换一个 View 的实现。另外一种用途就是在没有界面的情况下,只要实现了 View,就可以测试 Presenter。

实现视图

推荐的代码组织方式是将 View , View 的接口,Presenter 的类分别存放于不同的工程文件夹下。



Figure 2

MVP pattern implementation view

职责

Model 不知道 Presenter。所以 Model 被除 Presenter 之外的任何组件改变,必须通知 Presenter。通知一般是通过事件实现的。

示例

目前有一个 Appraisal (资产评估) 项目。在AppraiserWorkbenchModule 项目下有个 AppraisalDetail 项目文件夹,这个文件夹包含 IAppraisalDetailView 接口,AppraisalDetailView 类和 AppraisalDetailViewPresenter 类。

AppraisalDetailView 类负责以下事情:

1. 实现IAppraisalDetailView 接口

2. 与AppraisalDetailViewPresenter 对象关联。在 Presenter 属性上具有CreateNew 的attribute (特性),这将在AppraisalDetailView对象构造后,使 ObjectBuilder 创建并注入一个新的AppraisalDetailViewPresenter 实例。

1 [CreateNew]

2 public AppraisalDetailViewPresenter Presenter

3 {

4 set

5 {

6 Guard.ArgumentNotNull(value, "Presenter");

7 _presenter = value;

8 _presenter.View = this;

9 }

10 get

11 {

12 return _presenter;

13 }

14 }
3. 设置AppraisalDetailViewPresenter 对象上的View 属性为当前的AppraisalDetailView 自身。

4. 包含方法 ShowAppraisal。Presenter 使用这个方法来指示 View 来显示一个 Appraisal 业务实体数据的详细信息。

5. 调用 Presenter 来响应事件,Presenter 包含事件响应的逻辑。

AppraisalDetailViewPresenter 类包含了响应用户与 View 交互事件的逻辑,也包含了事件处理程序 WorkingAppraisalSelectHandler 。这个方法响应来自另外一个 View 的事件,来指示用户选定了一个 Appraisal ,当 Presenter 接收到事件,它调用AppraisalDetailView 的ShowAppraisal 方法来显示选中的 Appraisal 的详细信息。

更多信息

MVP模式是 MVC模式的变种,关于 MVC 模式,请访问 MSDN。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: