简述 MVC, MVP, MVVM三种模式
Make everything as simple as possible, but not simpler — Albert Einstein*
把每件事,做简单到极致,但又不过于简单 - 阿尔伯特·爱因斯坦
何为设计模式
- 具有某种重复性规律的方案,就是设计过程中可以反复使用的、可以解决特定问题的设计方法。
- 设计模式是针对特定上下文的特定问题的解决方案,这种解决方案被抽象化、模版化,就是设计模式。
- 是一种解决问题的思维,而并非某种特定的方法。
其实这三个解释是一个意思,只是给出不同的说法帮助理解这个抽象的概念。
为什么用设计模式
- 设计模式也可以帮助你提升思考架构的层次到模式层面,而不是停留在琐碎的对象上。
- 方便交流, 把隐形知识清晰地表达出来, 而不在于编码路线图。
- 让项目在庞大之后结构还是能非常清晰,不让代码失控。
- 显得专业,更加装X (呵呵)
OO(面向对象)设计原则
- 找出应用中可能需要变化之处,把它们独立出来, 不要和那些不需要变化的代码混在一起。这是我们的第一个设计原则。
- 针对接口编程,而不是针对实现编程。
- 多用组合,少用继承。
OOP(面向对象编程)原则
| 名称 | 简介 |
|---|---|
| 单一职责 原则 | 类的职责要单一,不能将太多的职责放在一个类中 |
| 开闭原则 | 软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件实体的基础上去扩展其功能 |
| 里氏代换原则 | 在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象 |
| 依赖倒转原则 | 要针对抽象层编程,而不要针对具体类编程 |
| 接口隔离原则 | 使用多个专门的接口来取代一个统一的接口 |
| 合成复用原则 | 在系统中应该尽量多使用组合和聚合关联关系,尽量少使用甚至不使用继承关系 |
| 迪米特法则 | 一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互 |
MV(X)
- Models(模型)数据层,负责处理数据,数据接口层
- Views(视图)展示层(GUI) 负责创建与展示 UI
- Controller、Presenter、ViewModel 主要是用来负责Model 和 View的沟通。
MVC 设计模式

以 IOS 开发为例,这里的 Controller 其实是 UIViewController。
这个是理想中的模型,但是在实际开发过程中,并没有想象中那样清晰。我们很多人都会觉的这个模式下的 UIViewController 太臃肿了,而且大大降低了 Contrlller 的重用性。我们在用这个模式的时候可能很多时候都是在考虑这样一个问题,网路请求到底是 Model 负责还是 Controller 负责。
View和 Model 是相互独立的这点很好,可以方便后来的单元测试。但是,我们一般会把复杂的业务逻辑放到 Controller 里面,这造成了很难去测试 Controller 。IOS 开发中 View 的整个生命周期都是需要 Controller 来管理,这就造成了 View 和 Controller 之间存在严重的耦合现象,在项目庞大之后看起来会特别散乱。
MVP模式

以 IOS 开发为例,这里的 View 其实是 UIViewController。
它是由 MVC 演变而来的,最大的变化莫过于上面这句话。对 MVP 的 Presenter 根本不用关心 ViewController 的生命周期,所以在 Presenter 里面几乎没有涉及到 UI 的代码,我们所有的 UI 处理全部放到了 UIViewController 里面,这样的话很符合之前说的单一职责。
这里要强调一下 MVP 模式的是双向通信的,我们看一段代码
// Assembling of MVP
let model = Person(firstName: "David", lastName: "Blaine")
let view = GreetingViewController()
let presenter = GreetingPresenter(view: view, person: model)
view.presenter = presenter
在这里面 presenter 同时持有 Model 和 View 两个对象,当用户操作 View 然后调用 Presenter 来改变 Model,Model 更新完毕后,presenter 调用 View 的方法来更新 UI。
MVVM模式

以 IOS 开发为例,这里的 View 其实是 UIViewController。
这个模式完全是由 MVP 进化过来的,它和 MVP 的不同点在于 ViewModel 和 View 之间的通信采用的是数据绑定,ViewModel 不像 MVP 中的 presenter直接持有 View 对象,在这个模式中,ViewModel无法直接调用 View 来更新 UI 而是通过事件回调的方式来通知 View 更新,比如通过协议、通知、代理、闭包等等一些方式来异步的更新 UI。这是跟 MVP 最大的区别。这个是为了满足UI层更加细节化、可定制化。
// Assembling of MVVM
let model = Person(firstName: "David", lastName: "Blaine")
//View中实现了delegate
let view = GreetingViewController()
let viewModel = GreetingViewModel(person: model)
//让 ViewMode 持有此代理
viewModel.delegate = view
view.viewModel = viewModel
以上就是我自己对三种模式的理解,希望对大家有所帮助,如有错误还请留言指出。
参考链接:
http://john-kong19.iteye.com/blog/934105
http://www.jianshu.com/p/b42a26623aeb
http://www.jianshu.com/p/75fab47aaacc
http://www.programmer-club.com.tw/showSameTitleN/c/42739.html
http://willtea.iteye.com/blog/1704806
http://blog.csdn.net/txchen/article/details/1554361
https://blog.coding.net/blog/ios-architecture-patterns
http://blog.csdn.net/tyk0910/article/details/51120898
http://blog.csdn.net/wqc_CSDN/article/details/53749848
简述 MVC, MVP, MVVM三种模式的更多相关文章
- android中MVC,MVP和MVVM三种模式详解析
我们都知道,Android本身就采用了MVC模式,model层数据源层我们就不说了,至于view层即通过xml来体现,而 controller层的角色一般是由activity来担当的.虽然我们项目用到 ...
- Android MVC MVP MVVM (三)
MVVM Model-View-ViewModel的简写 在MVP基础上实现数据视图的DataBinding,数据变化,视图自动变化,反之也成立. DataBinding 启用DataBinding ...
- js架构设计模式——你对MVC、MVP、MVVM 三种组合模式分别有什么样的理解?
你对MVC.MVP.MVVM 三种组合模式分别有什么样的理解? MVC(Model-View-Controller)MVP(Model-View-Presenter)MVVM(Model-View-V ...
- 浅析前端开发中的 MVC/MVP/MVVM 模式
MVC,MVP和MVVM都是常见的软件架构设计模式(Architectural Pattern),它通过分离关注点来改进代码的组织方式.不同于设计模式(Design Pattern),只是为了解决一类 ...
- 用户界面编程模式 MVC MVP MVVM
用户界面编程模式 MVC MVP MVVM 程序 = 数据 + 算法 数据:就是待处理的东西 算法:就是代码 涉及到人机交互的程序,不可避免涉及到界面和界面上显示的数据原始方式是界面代码和逻辑代码糅合 ...
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
- MVC, MVP, MVVM比较以及区别(上)
MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...
- android MVC && MVP && MVVM分析和对比
相关:http://www.cnblogs.com/wytiger/p/5305087.html 出处http://blog.csdn.net/self_study,对技术感兴趣的同鞋加群544645 ...
- MVC, MVP, MVVM比较以及区别
MVC, MVP和MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式.以前只是对它们有部分的了解,没有深入的研究过,对于一些里面的概念和区别也是一知半解.现在一边查资料,并结合自己的理解,来谈一下 ...
随机推荐
- maven项目互相dependcy依赖问题
1.自己编写的maven项目,在编译后,也会在.m2文件夹下生成jar包,可以供第三方引用使用. 2.比如几个项目互相依赖对方的jar包,就要首先选择编译哪个jar包,编译完成后生成jar,再编译依赖 ...
- ubuntu10.04 建V
ubuntu10.04架设vpn服 vpn 安装: pptpd:apt-get install pptpd 1. 配置网络IP地址,编辑 vim /etc/pptpd.conf ,去掉下面两行前面# ...
- Java设计模式—单例设计模式(Singleton Pattern)全然解析
转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...
- HDMI接口基础知识及硬件设计
参考资料:http://blog.csdn.net/u013625961/article/details/53434189: http://blog.csdn.net/u014276460/artic ...
- 跨域CORS原理及调用详细演示样例
上篇博客介绍了JSONP原理,其不足,就是仅仅能使用GET提交.若传输的数据量大.这个JSONP方式就歇菜了.那这篇博客就来介绍还有一种跨域介绍方案-CORS. 相对JSONP,CORS支持P ...
- Java内存问题的一些见解
在Java中,内存泄露和其它内存相关问题在性能和可扩展性方面表现的最为突出.我们有充分的理由去具体地讨论他们. Java内存模型--或者更确切的说垃圾回收器--已经攻克了很多内存问题. 然而同一时候, ...
- 20170626_oracle_数据库设计
数据库设计的定义:规划数据库中数据对象以及之间关系的过程. 为什么进行数据库设计? 空间 完整性 程序开发 数据库设计前提知识: 范式: 1NF:第一范式 第一范式的目标是确保每列的原子性 如果每列都 ...
- luogu1314 聪明的质检员
题目大意 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1 到 n 逐一编号,每个矿石都有自己的重量 wi 以及价值 vi.检验矿产的流程是: 1.给定 m 个区 ...
- 关于Domain Sepcific Lang
今天在看一些关于CO的东东 里面提到,用从语言派生出来的领域语言再去编写代码会大大加速开发进程 PHP应该是个典型的领域语言(Perl之于文本处理也是这样),虽然不是从什么其他领域派生出来的,但是使用 ...
- centos ifconfig 无法使用问题
centos ifconfig 无法使用问题 # ifconfig bash: ifconfig: command not found # yum search ifconfig Loaded plu ...