`

MVC和MVP的一些思考

    博客分类:
  • ios
 
阅读更多

 

前言

这篇文章是我近期对MVC和MVP的一些思考,在使用MVC/MVP模式的过程中曾经走过一些弯路。呵呵,现在虽然改正了某些弯路,但不保证改正了所有的弯路(例如对渲染的理解),所以请阅读这篇文章的朋友不吝发挥你们的质疑。

写这篇文章也是想知道自己还有什么地方是错的,我的最终方案是否可行?

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

 

1. MVC的理解误区

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

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

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

这两个误区本质上都是对应用开发中,Model的作用不明导致的。还有就是应用开发的mvc和web开发mvc开发之间的不同,在web开发中,逻辑是写在controller中的,而应用开发逻辑则是在model中,controller是用来对消息进行分发的

 

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,而且框架上更“干净”,开发人员写起来更自由。

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

 

相关:理论:MVP模式与MVC模式

分享到:
评论

相关推荐

    关于MVC的思考

    **关于MVC模式的深入思考** MVC(Model-View-Controller)模式是软件工程中的一种设计模式,常用于构建Web应用程序,以实现业务逻辑、数据处理和用户界面的分离,提高代码的可维护性和可扩展性。在这个模式中,模型...

    Android工程师面试资料

    - MVC、MVP、MVVM:理解各自的设计原则和应用场景。 - 单例模式、工厂模式、观察者模式等常见设计模式的应用。 4. **性能优化**: - 内存优化:避免内存泄漏、减少内存抖动,理解MAT工具分析内存。 - 性能监控...

    架构师该如何考虑软件可持续迭代

    常见的架构手段包括模型-视图-控制器(MVC)、模型-视图- presenter(MVP)和模型-视图-视图模型(MVVM)。MVC将业务逻辑、界面展示和用户交互分离,但可能导致View和Controller过于庞大。MVP实现了View和Model的...

    软件工程中的架构设计与模式应用.pptx

    - **MVC(Model-View-Controller)模式**:将应用程序分为模型、视图和控制器三部分,有助于降低各部分之间的耦合度,提高代码的可维护性和复用性。 - **MVVM(Model-View-ViewModel)模式**:在前端开发中常用,...

    android-patterns-master.zip

    《Android设计模式实战解析》 在移动开发领域,Android作为全球最受欢迎的操作...在学习过程中,建议结合代码仔细分析每个模式的实现方式,同时思考如何将它们融入到实际工作流程中,以优化代码结构和提升开发效率。

    Android面试题 答案第三版 高清完整版pdf.pdf

    14. **设计模式**:在面试中,面试者应能熟练应用单例、工厂、观察者、MVC/MVP/MVVM等设计模式。 15. **项目经验与问题解决能力**:面试官会询问实际开发中遇到的问题及解决方案,考察开发者的问题解决能力和实践...

    4面字节跳动拿到2-2 Offer,入职就是30K16薪,全靠这份Android知识点PDF大全(csdn)————程.pdf

    - Android架构模式(如MVC、MVP、MVVM) - View事件分发机制 - 单例模式实现 - 算法题,如有序数组相加求序列对 - Android内存泄漏及排查方法 - Handler机制、ANR机制 - 冷启动优化、弱网优化 - 视频处理、...

    一文搞懂各种架构业务架构应用架构数据架构.docx

    框架是组件实现的规范,例如MVC、MVP、MVVM等,是提供基础功能的产品,例如开源框架:Ruby on Rails、Spring、Laravel、Django等,这是可以拿来直接使用或者在此基础上二次开发。框架是规范,架构是结构。我在这里...

    千辛万苦收集的打包50个优秀Android项目源码

    1. **设计模式**:源码中可能涵盖了多种经典设计模式,如单例模式、工厂模式、观察者模式、MVC、MVVM、 MVP等。通过学习这些模式,开发者能更好地组织代码,提高代码的可读性和可维护性。 2. **架构组件**:源码...

    Android 365手机秘书源码.rar

    "Android 365手机秘书"的源码可能会展示MVC(Model-View-Controller)、MVVM(Model-View-ViewModel)或 MVP(Model-View-Presenter)等常见的设计模式。通过分析源码,我们可以学习到如何将业务逻辑、视图状态和...

    外文翻译:学用JavaScript设计模式

    - **MVP(Model-View-Presenter)模式**:与MVC类似,但更强调视图和模型之间的解耦。 - **MVVM(Model-View-ViewModel)模式**:通过引入ViewModel层来实现视图和模型之间的数据绑定。 #### 最新的模块化...

Global site tag (gtag.js) - Google Analytics