MVC MVVM MVP

MVC,顾名思义,MVC是将Model, View和Controller分离,让彼此的职责(responsibility)能够明确的分开,这样不论是改M, V还是C,都可以确保另外两层可不用做任何修改,同时这样的分层也可以加强程式的可测试性(testability),View和Model基本上是相关的,但它们并不会有直接的相依关系,而是由Controller去决定Model产生的资料,然后丢给View去做呈现,也就是说,Controller是Model和View之间的协调者(coordinator),View和Model不能直接沟通,以确保责任的分离。而Controller可以只是一个系结Model和View的小类别,也可以是大到包含Workflow, Enterprise Services或是做为外部系统的Proxy Services等的逻辑系统,MVC各元件是可以分离的组件,也可以是分离的系统(当然要设计一些机制在相互沟通)。

 MVVM,MVVM的架构一样是M, V分离,但中间是以VM (ViewModel)来串接,这个ViewModel比较像是View的一个代理程式,它负责直接对Model做沟通,而View可以透过一些机制(ex: Events, Two-way Databindings, ...)来和ViewModel沟通以取得资料或将资料抛给Model做存取等工作,ViewModel也可以作为和外部系统的代理程式,例如Web Service或是REST Service或是Enterprise Services等等,不过它和MVC不同的地方,就是ViewModel和View的黏合度比较高,因为View必须要透过ViewModel才可以取得Model,而ViewModel又必须要处理来自View的通知讯息,所以虽然职责一样分明,但是却不像MVC那样可以扩展到整个系统元件都能用。如果MVVM要和MVP比较的话,MVVM会比MVP更灵活一点。

  MVP一样也是职责分明,且Model与View分离的架构,但是这个P (Presenter)和ViewModel就很类似,不过就如同Presenter (主持人)这个字所代表的意义,所有主控View呈现的工作,都是由Presenter来做,而View本身只是Presenter所要使用的舞台而已,所以View原则上会相依于Presenter,但是为了要做到关注点分离(SoC原则),所以在View和Presenter间都会加入一个介面(ex: IView),然后以IoC的方式将View注射到Presenter中,而Presenter就使用介面所定义的方法去操控,而View就透过介面所定义的方法去呈现介面即可。但也因为受限于介面,所以Presenter只能依介面定义的动作去回应与处理,而不能再做更多的延伸功能,除非更改View的介面。

  

由上面各个架构的讨论,我们可以得到以下的结果:

  1. MVC 架构适合于大型系统,它可以分层且可以在实体层面切割为不同的机器或服务,只要彼此间具有适当的通讯协定即可。
  2. MVVM 架构适合像XAML 这种与程式码无关(code ignorance) 的使用者介面设计,只要View 中下特定的指令与ViewModel 串接,就可以享有ViewModel 沟通的功能,而ViewModel 只需做一些特别的介面实作,即可平顺的和View 沟通。
  3. MVP 架构适合集中由程式码决定View 动作的应用程式,而View 只需要实作特定的介面即可,不需要太复杂的工作,但Presenter 则可能会受限于View 介面的动作,而无法做更进一步对View 的控制。

最后我想提的是,MVC的包容度比MVVM和MVP要来的高,在MVC的V层,可以再进一步的包含MVVM或MVP的实作,而C层也可以使用MVP (V是输出的资料)来进一步切割资料的流动与输出,M层则可以类似MVVM的架构,当V (元件)有资料的异动时,VM即可自动侦测到并更新Model (资料库)。当然,要用什么样的架构去设计,端看当时的系统环境与需求来决定,而不是只想着要用同一种架构去做所有的系统。

时间: 2024-10-09 22:12:36

MVC MVVM MVP的相关文章

c++  与  java  中的 继承

C++ 代码: #include <iostream> #include <string> using namespace std; class Parent { public: void fun() {cout<<"Parent fun"<<endl;} void fun(int a) {cout<<"Parent fun int a"<<endl;} void fun(int a, int

python 学习第八课 -- 异常 反射 socket

面向对象 相关 一.isinstance(obj,cls)  查看obj是否为cls的对象 issubclass(sub,super) 查看类sub是否为super的派生类 二. 异常处理 1.   异常基础 try: pass except Exception,e: print e e为Exception的对象,print e 就是print Exception中的__str__ 2.   异常种类 常用异常 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo

自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解

'*************************************************************************'**模 块 名:自写函数VB6 STUFF函数 和 VB.net 2010 STUFF函数 详解'**说    明:蓝凤凰设计商城 浴火凤凰-郭卫 | 蓝凤凰-魔灵 | 郭卫-icecept'**创 建 人:浴火凤凰-郭卫'**日    期:2015年10月10日  23:13:55'**修 改 人:浴火凤凰-郭卫'**日    期:'**描   

lind 语 api 数据的安全性  第四弹

web api的安全性怎么保证呢. 一般公司会自己封装一套请求的规范. 下面来看看lind语里的webapi安全规范 step one 先看下 diagram: 学而思: 从上面的图分析一下: 如果我们的webapi开放给第三方的平台那么:这里的规范是否适用呢. 思考一下. 成为习惯 step tow .... 我们来看下代码: 注意 我们是因为里面又两个:一个 是 看 的我 .一个是 学的我.一个是思的我. 所以 这里是有三个我 看我曰:我去翻码.

TCP 和 UDP 编程 —— Android

参考了<深入理解Android网络编程>这本书 我们都知道TCP和UDP最大的区别就是,TCP是面向连接的,而UDP是无连接的. 那么使用TCP和UDP编程,事实上差别也是在这里: 1.使用TCP通讯: 分为客户端和服务器,主要是先初始化,像IP,端口这些肯定要先绑定的,服务器等待客户端连接,连接之后,通过流进行数据的收发. A.首先是服务器端: 步骤1:初始化——ServerSocket serverCocket = null://创建一个ServerSocket对象 serverCocke

Linux 内存 virt res shr data swap 意义

virt  res shr data 这几个很容易搞混了,写一下 首先解释下含义: virt : 程序占用的虚拟内存 man: The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out and pages that have been mapped but not used. r

HDU 1025 Constructing Roads In JGShining&#39;s Kingdom   LIS 简单题 好题 超级坑

Constructing Roads In JGShining's Kingdom Problem Description JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which are located in two parallel lines. Half of these cities are rich in resource (we call them rich cities) whi

Centos6.5 配置  DRBD8.4.3

废话不多说,现在开始: 1.2台虚拟机,Centos6.5系统,系统配置啥的都一样,能互相ping 通.把它们称为A和B. 2. A: server iptables stop setenforce 1                 //先把这2台服务器的防火墙和SELINUX关闭. ------------------------------------------- B: server iptables stop setenforce 1                 //先把这2台服务

《程序员的职业修养》读后感(二):说"不" and 说“是”

简介:"能就是能,不能就是不能,不要说'试试看'."另一方面,作为一个初入行业的程序员,我们有没有权利,应不应该说不(或是)呢,又该何时何地何事说"不(或是)"?这篇文章就解决此问题. 相信工作的人对此都会很有感触,当老板交给我们一个任务时,不管是对自己能力的不清楚认识,还是迫于老板的"淫威",大家貌似好像都不敢说一句能或者不能,总是选择一个折中的答案:我去试试看.可是这样的话语给老板的潜意识意思就是你可以完成,但是在你这里,这句话的潜意思就是我也很可能完不成.所以