什么是MVP和MVC,它们有什么区别?
技术背景
在软件开发中,为了实现代码的模块化、可维护性和可测试性,人们设计了许多架构模式。MVP(Model - View - Presenter)和MVC(Model - View - Controller)就是其中两种常见的架构模式,它们都旨在分离业务逻辑和展示逻辑,提高软件的可维护性和可扩展性。
实现步骤
MVP模式
- 模型(Model):负责处理数据和业务逻辑。
- 视图(View):是一个接口,用于显示数据并将用户命令(事件)路由到Presenter。视图通常持有对Presenter的引用,但不包含逻辑。
- Presenter:作为视图和模型之间的“中间人”,持有对视图和模型的引用。Presenter负责将模型绑定到视图,并处理用户交互的逻辑。
两种主要变体
- 被动视图(Passive View):视图尽可能简单,几乎不包含逻辑。Presenter是与视图和模型进行交互的中间人,视图和模型完全相互屏蔽。模型可以触发事件,但Presenter订阅这些事件以更新视图。在被动视图中没有直接的数据绑定,而是视图暴露了Presenter用于设置数据的setter属性,所有状态都由Presenter管理。
- 优点:可测试性高,视图和模型分离清晰。
- 缺点:需要更多的工作,例如手动进行所有的数据绑定。
- 监督控制器(Supervising Controller):Presenter处理用户手势,视图通过数据绑定直接绑定到模型。Presenter的工作是将模型传递给视图,以便视图可以进行绑定。Presenter还包含处理按钮点击、导航等手势的逻辑。
- 优点:通过利用数据绑定减少了代码量。
- 缺点:可测试性降低(由于数据绑定),并且视图的封装性较差,因为它直接与模型通信。
MVC模式
- 模型(Model):处理数据和业务逻辑。
- 视图(View):负责处理图形用户界面对象和展示,通常是无状态的,不包含逻辑。
- 控制器(Controller):负责根据用户的操作决定显示哪个视图。控制器接收视图的操作请求,处理业务逻辑,并返回正确的视图。
核心代码
MVP模式示例(Passive View变体)
// 视图接口
public interface ICustomerView
{
string Name {
get; set; }