MVC和MVP的一些思考

  这篇文章是我近期对MVC和MVP的一些思考,在使用MVC/MVP模式的过程中曾经走过一些弯路。呵呵,现在虽然改正了某些弯路,但不保证改正了所有的弯路(例如对渲染的理解),所以请阅读这篇文章的朋友不吝发挥你们的质疑。
  写这篇文章也是想知道自己还有什么地方是错的,我的最终方案是否可行?

  有交流才会有进步。你有一个苹果,我有一个苹果,我们交换后仍各有一个苹果,你有一个思想,我有一个思想,我们交换后......会有N个思想 :p

  1. MVC的理解误区

  以下是我以前对MVC模式的理解误区:

  1. 认为Model是指失血模型的实体类(Entity),是作为View和Controller之间的传输数据。

  2. 把业务逻辑全部放在Controller端,认为Controller是用来写UI的业务逻辑的。

  这两个误区本质上都是对Model的作用不明导致的。

  Model在MVC架构中起的作用非常重要,它才是UI业务逻辑真正的实现层。所以Model的实际上是Business Model(业务模型)。

  而 Controller仅仅起一个“桥梁”作用,它负责把View的请求转发给Model,再负责把Model处理结束的消息通知View。 Controller就是一个消息分发器。Controller是用来解耦View和Model的,具体一点说,就是为了让UI与逻辑分离(界面与代码分离)。

  2. MVC与VCP的区别

  MVC的View直接与Model打交道,Controller只转发请求(View的请求)和通知(Model处理完之后的通知),不传递数据(业务结果),而是由View直接向Model拿数据。

  MVP的View不与Model直接联系,所有的请求、结果通知、数据传递都是通过Controller转发,View和Model彼此不知道对方的存在。
  
  3. MVC与MVP的相同点

  无论是MVC还是MVP,View和Controller都是紧密联系的,在WinForm模式下更显得突出,View和Controller直接绑定在一起了(在一个类里面)。

  MVC/MVP都是通过“通知”机制(观察者模式,在C#中使用事件)来解决View和Controller的交互。

  4. MVP框架的设计

  在MVP框架里,用Presenter代替MVC的Controller,而且View不再与Model交互。

  4.1. Presenter

  Presenter的作用比Controller大得多,Controller只是一个纯粹的消息分发器,而Presenter还负责传递Model的处理结果给View,并指导View的渲染。

  注意,渲染我理解为UI的展现方式。

  4.2. Presenter与Model

  Presenter与Model使用接口隔离,Presenter直接调用Model的接口方法(比如IUserModel的FetchUserList()、SaveUser()等)。

  4.3. Presenter与View

  View与Presenter的交互使用观察者模式,有两种方式实现:

  1. View主动使用Presenter。

  View主动构造Presenter,并在内部调用Presenter的方法。即先有View再有Presenter。这种情况下,View明确知道自己要使用哪些Presenter。

  2. Presenter主动使用View。

  Presneter主动创建View,View里面定义有一堆的事件,Presenter注册这些事件。这种情况下,View不知道自己会被哪些Presenter使用。

第二种方式比第一种方式耦合性低,但View里要写一堆的事件,Presenter类里要捕获一堆的事件,感觉写起来很烦琐,代码不雅观。

  5. Controller/Presenter的意义

  以下Controller/Presenter简称为C/P。

  C/P存在的意义是为了解耦View和Model。如果C/P不存在的话,View就直接访问Model,而View的变化是频繁的,不同的系统,View的展现方式不一样,让Model去控制View的渲染,会降低Model的重用性。如果Model不管View的渲染,由View自己渲染,那么就是 WinForm的解决方式,即View和C/P经绑定(合并为一个类)。

  6. 为什么要用MVC/MVP模式?

  老实说,到目前为止,我依然看不出WinForm把Model分离之后,与标准的MVC/MVP有什麽差距。在WinForm分离Model之后,两者的交互可以用接口隔离,也可以用观察者模式让Form与Model一对多。再用IoC替代View直接构造Model的实例,那么WinForm代表的View+C/P(Form)已经与Model完全解耦了,View+C/P层连Model层都不需要引用(但要引用IModel层)。

  这里关键是使用IoC技术,否则WinForm确实会导致View与Model直接耦合,更换Model,或者改变Model的接口会导致View要修改。注意,我们分离出来的 Model,并不完全是为了使UI与代码分离,我们更注重Model的重用性,力求一个Model被多个View享用,甚至是不同系统的View享用。这就要求我们改动View的渲染时不用改动Model,同样地,我们改动Model的内部逻辑时,也不影响View的渲染。

  嗯,或许还有一点:View通过Controller/ Presenter交互,使得系以统可以有一个共同的“入口”,系统可以在入口处做拦截,利于日志和权限的处理。但我们可以用AOP技术替代C/P的入口。

  7. 新方案

  由此看来,IoC+AOP可以完全替代C/P,而且框架上更“干净”,开发人员写起来更自由。

  一些零碎的想法,有什么错误的地方请大家多多指教,谢谢。

时间: 2024-09-29 02:59:12

MVC和MVP的一些思考的相关文章

艾伟_转载:MVC和MVP的一些思考

这篇文章是我近期对MVC和MVP的一些思考,在使用MVC/MVP模式的过程中曾经走过一些弯路.呵呵,现在虽然改正了某些弯路,但不保证改正了所有的弯路(例如对渲染的理解),所以请阅读这篇文章的朋友不吝发挥你们的质疑. 写这篇文章也是想知道自己还有什么地方是错的,我的最终方案是否可行? 有交流才会有进步.你有一个苹果,我有一个苹果,我们交换后仍各有一个苹果,你有一个思想,我有一个思想,我们交换后......会有N个思想 :p 1. MVC的理解误区 以下是我以前对MVC模式的理解误区: 1. 认为M

【框架篇】mvc、mvp、mvvm使用关系总结

MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 数据关系 View 接受用户交互请求 View 将请求转交给Controller Controller

Android开发模式之MVC,MVP和MVVM的简单介绍与区别

相信大家对MVC,MVP和MVVM都不陌生,作为三个最耳熟能详的Android框架,它们的应用可以是非常广泛的,但是对于一些新手来说,可能对于区分它们三个都有困难,更别说在实际的项目中应用了,有些时候想用MVP的,代码写着写着就变成了MVC,久而久之就对它们三个的选择产生了恐惧感,如果你也是这样的人群,那么这篇文章可能会对你有很大的帮助,希望大家看完都会有收获吧! 文章重点: (1)了解并区分MVC,MVP,MVVM. (2)知道这三种模式在Android中如何使用. (3)走出data bin

MVC、MVP、MVVM三种框架模式到底怎么理解?

问题描述 MVC.MVP.MVVM三种框架模式到底怎么理解? 如题,这三个到底该如何理解? 1.M到底只是数据,还是数据+业务逻辑?如果是前者,为何不叫Data? 2.MVP里,M对V有没有影响?是不是说,P处理后发现存储的数据需要改变,就通知M改变,显示的数据需要改变,就通知V改变? 3.MVVM与MVP相比,进步的地方在哪里? 4.对于软件开发者与WEB全栈开发者而言,这三种框架模式的意义相同吗? 看了网上很多这方面的说法,感觉众口不一,枯涩难懂,哪位前辈能彻底解惑.以正视听呢? 解决方案

不必纠结MVC还是MVP了,听我说两句~

MVC全称是Model-View-Controller 也就是模型–视图–控制器.是在1970年的时候提出由TrygveReenskaug在Smalltalk-80系统上首次提出的. SmallTalk在百度百科的解释是这样: Smalltalk被公认为历史上第二个面向对象的程序设计语言和第一个真正的集成开发环境 (IDE). 来张图说明一下MVC的工作模式吧   图中红色小框框就是MVC的工作模式 从图中可以看出用户向View发送指令,再有View直接要求Modle改变状态 用户也可以直接向C

界面之下:还原真实的 MVC、MVP、MVVM 模式

前言 做客户端开发.前端开发对MVC.MVP.MVVM这些名词不了解也应该大致听过,都是为了解决图形界面应用程序复杂性管理问题而产生的应用架构模式.网上很多文章关于这方面的讨论比较杂乱,各种MV*模式之间的区别分不清,甚至有些描述都是错误的.本文追根溯源,从最经典的Smalltalk-80 MVC模式开始逐步还原图形界面之下最真实的MV*模式. GUI程序所面临的问题 图形界面的应用程序提供给用户可视化的操作界面,这个界面提供给数据和信息.用户输入行为(键盘,鼠标等)会执行一些应用逻辑,应用逻辑

[Android]对MVC和MVP的总结

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5036289.html 经历过的客户端的架构分为这么几个阶段: 第一阶段 使用传统的MVC,其中的View,对应的是各种Layout布局文件,但是这些布局文件中并不像Web端那样强大,能做的事情非常有限:Controller对应的是Activity,而Activity中却又具有操作UI的功能,我们在实际的项目中也会有很多UI操作在这一层,也做了很多View中应该

MVC、MVP以及Model2[下篇]

[上篇]通过采用MVC模式,我们可以将可视化UI元素的呈现.UI处理逻辑和业务逻辑分别定义在View.Controller和Model中,但是对于三者之间的交互,MVC并没有进行严格的限制.最为典型的就是允许View和Model绕开Controller进行直接交互,View不仅仅可以通过调用Model获取需要呈现给用户的数据,Model也可以直接通知View让其感知到状态的变化.当真正地将MVC应用于具体的项目开发中,不论是基于GUI的桌面应用还是基于Web UI的Web应用,如果不对Model

MVC,MVP 和 MVVM 的图示

复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了. 昨天晚上,我读了<Scaling Isomorphic Javascript Code>,突然意识到,它们的区别非常简单.我用几段话,就可以说清. (题图:摄于瓦伦西亚,西班牙,2014年8月) 一.MVC MVC模式的意思是,软件可以分成三个部分. 视图(V