展现模式比较

展示模式架构比较MVP(SC),MVP(PV),PM,MVVM和MVC
介绍

本文将比较4重重要的展示模式架构,包括MVP(SC),MVP(PV),PM,MVVM和MVC。很多开发者围绕着这些模式间有什么不同及何时用哪种模式而感到困惑。本文将首先介绍背景之后解释不同的展示模式。接着我们将进一步讨论状态,逻辑和同步问题。最后我们将深入每种模式并总结它们之间的不同。

这里是对我的.NET朋友的小礼物,400页的FAQ电子书,包含各种.NET技术,例如Azure,WCF,WWF,Silverlight,WPF,SharePoint和其他。

特别致谢

全文是从http://martinfowler.com/eaaDev/uiArchs.htmlGUI架构的摘要。Mr. Martin flower的伟大工作。

Josh Smith和团队http://msdn.microsoft.com/en-us/magazine/dd419663.aspx,关于MVVM的伟大工作。

Mr. Mikhil kothari的博客http://msdn.microsoft.com/en-us/magazine/dd419663.aspx,关于MVVM的帅代码。

Mr. Oleg Zhukov解释了如何实现一个.NET的MVP框架,http://www.codeproject.com/KB/architecture/DotNetMVPFramework_Part1.aspx

背景——展示模式

与用户界面相关的一个最大问题是大量杂乱的代码。这种混乱代码由于两个主要原因,首先是UI有复杂的逻辑来操作用户界面对象,,第二它还维护应用的状态。展示模式解决了围绕着如何删除UI的复杂性和是的UI更简洁和可管理的问题。下面是展示模式不同的变种和分类:

展示模式主要分为三类MVP(Model View Presenter),MVC(Model View Controller)和最后的PM(Presenter Model)。MVP进一步分为监督控制器和被动视图。PM进一步被微软团队分成两个技术特定模式Sliverlight的MVVM和WPF的MVVM。

UI的3大问题:状态,逻辑和同步

下面列出了UI相关的三大问题。

状态:状态/数据是UI最大担忧之一。状体意味着UI的当前数据展示。在Web术语里它可以是会话变量,而在Windows应用中它可以是简单地UI级数据。UI保持的状态越多,复杂性也越高。

逻辑:UI通常有UI逻辑,例如操作文本框,组合框或其他UI组件。在UI中,越多的这种逻辑存在,它就越复杂。

同步:UI通常要协调域/业务组件。UI还需要同步UI元素(文本框,组合框等)和业务对象间的数据。如果你的UI重复进行同步,那么UI的复杂性就大大增加。

英雄——展示设计模式

展示设计模式帮举解决以上的UI问题。程序设计模式的基本逻辑是创建附加类,该类处理当前UI需要处理的复杂逻辑,数据和同步问题,使得UI转嫁责任,更简洁和简单。取决于这个类负责的职责,进一步定义为它为SC,PV,PM设计模式等等。换句话说,展示类的成熟度决定了它是哪种设计模式。

简化文章的缩写

缩写全称

V视图或UI(View or UI)

P包含UI逻辑的展示器类(Presenter class which has the UI logic)

LUI逻辑(UI logic)

SUI的状态(State of the UI)

M业务组件或域对象(Bissiness components or domain objects)

SC监督控制器(Supervising controller)

PV被动视图(Passive view)

PV展示器模型(Presenter model)

我们使用以上缩写来简化展示设计模式的解释。

监督控制器模式(SC)

SC的基础:

状态存储在视图里。

展示器包含复杂的展示逻辑。简单的UI绑定逻辑通过使用绑定技术来完成,例如WIF绑定和Silverlight绑定。任何复杂性有展示器类处理。

展示器知道视图。

视图不知道知道展示器。

视图使用由WPF和Silverlight提供的绑定技术与模型链接。

被动视图(PV)

PV的基础:

状态存储在视图里。

所有UI逻辑存储在展示器里。

视图与模型完全隔离。它还处理模型和视图见额外的同步任务。

展示器知道视图

视图不知道展示器。

你可以从这里知道更多关于MVP(PV)的知识,它还有一个样例代码,展示了MVP如何进入行动链的。

展示模型(PM)

PM的基础:

状态储存在展示器里。

逻辑存储在展示器里。

展示器代编一个抽象的UI视图。

展示器不知道视图

视图知道展示器。

视图与模型完全隔离。

MVVM

MVVM的基础:

展示器模型是基础。

状态储存在展示器里。

逻辑存储在展示器里。

展示器代表一个UI的抽像视图。

展示器不知道视图。

视图知道展示器。

视图与模型完全隔离。

使用WPF和Silverlight绑定。

MVC

MVC的基础:

没有展示器,有一个控制器。

请求首先到达控制器。

控制器绑定模型和视图。

逻辑存储在控制器里。

你可以从这里知道更多MVC的知识,它还有一个样例代码,展示了MVC如何处理行动链。

总结

下面是对所有展示模式从状态,逻辑和同步方面总结的比较表格。

状态逻辑同步

Supervising Controller

PresenterXX

ViewX

ModelDatabinding

Passive View

PresenterXX

ViewX

Presenter Model

PresenterXX

ViewX

MVVM

PresenterXX

ViewX

ModelDatabinding

MVC

ControllerXX

ViewX

下面是上面讨论内容的图形化比较。

何时使用MVP或MVC

首先以上所有模式都是MVC的变种。换句话说,所有MVP模式都是扭曲的MVC。我们将首先比较MVC和MVP,之后我们将比较不同的MVP变种。

下面是MVP优于MVC的情况.

UI单元测试:如果你的项目对UI有自动化压力单元测试,那么MVP优于MVC,因为MVP的展示器类与所有UI逻辑隔离。展示器是UI的完全模拟,因此它可以使用VSTS测试套件或NUNIT单独进行单元测试。

视图有细微不同:如果你的应用本质上视图对不同的数据可复用,那么MVC就够了。特别是应用更注重报告。比如你有两个视图,几乎一样分别“按月销售”和“按年销售”。两个报告使用同一个ASPX页面显示不同的模型。那么如果你的应用有相同的UI,使用MVC的变种是个好选择。特别是本质上是面向报告的应用,MVC优于MVP。

多UI支持:如果预见应用将使用不同而UI技术,MVP是个好选择。换句话说,应用既支持Window还支持Web,优选MVP。它将帮助你提高展示器类的复用性。

复杂的屏幕:如果有许多复杂的用户交互,MVC会变得复杂,因为最终每个交互会有许多控制器类。MVP是更好的选择,因为你可以封装这些复杂的逻辑到一个类,并可以分开测试来确保无bug。

技术使用:技术是一个非常重要的因素。如果技术支持架构构建自动化,使用相应的模式就变得更有意义。例如你使用纯ASP.NET,应用不带Silverlight或WPF,使用MVP会更理智。ASP.NET页面期望在其他代码处理控制事件,而MVC则期望在控制器中处理事件。因此最终我们要重写全部的事件处理代码,因为ASP.NET控制着控制器。如果你使用Silverlight或WPG,它们有很好的丙丁支持,这使得MVP更适合。在另一方面,如果你有微小的变化,你也有3.5作为框架,你可以使用MVC框架,自动满足你的需求。

选MVC还是MVP的60%是技术选择驱动的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容