MVC,MVP架构模式

MVC

MVC模式

为了将数据模式和视图分离开来,并以控制器作为连接两者的桥梁以实现解耦。

MVC是一种框架模式而非设计模式,GOF把MVC看作是3中设计模式:观察者模式、策略模式与组合模式的合体,而且其核心在观察者模式,也就是一个基于发布/订阅者模型的框架。

对于框架(框架模式)来说,通常是对代码的重用,而对设计(设计模式)来说通常是对设计的重用,可以简单地这样理解框架面向于一系列相同行为代码的重用,而设计则面向的是一系列相同结构代码的重用,我们平常所有的架构则介于框架与设计之间。

简而言之:框架是大智慧,用来对软件设计进行分工;设计模式是小技巧,对具体问题提出解决方案,以提高代码复用率,降低耦合度。
对这句话我的理解:MVC是个框架,把程序分为Model-View-Controller。单例模式是个设计模式,针对一个类只能有一个实例提出了静态内部类方式创建单例。

MVC在Android中的实现

View层:一般采用XML文件进行界面描述

Model层:

  • 对应于本地的数据文件或网络获取的数据体
  • 从各个数据源(网络/DB)获取保存等业务代码

Controller层:Activity承担

控制器Activity主要起到的作用就是解耦,将视图View和模型Model进行分离,两者在Activity进行绑定或完成其他逻辑。

自己开发遇到的认知错误:
经常把网络请求等操作都写在activity中,往往会导致activity中代码过多。
现在把这些网络请求代码写到Model中,这样有利于将业务的分离。

MVC在Android使用的实例:(网络请求是使用了Retrofit2)
https://github.com/yeoggc/MVCSimpleExample

MVP

MVP与MVC关系以及差异

MVP与MVC关系

在MVC中随着业务需求以及复杂酷炫UI不断增加,会有以下问题:

  • 本属于View层中操作UI相关代码,被迫的转移到Activity,导致Activity即作为Controller也负责分担UI逻辑,以致变得庞大臃肿并且不方便进行单元测试。
  • View层和Model层并未实现完全的解耦

而MVP的出现可以更好的解决上诉问题:

  • 通过MVP我们可以把MVC进行如下优化,将Activity其中复杂的逻辑处理移至另外的一个类(Presneter)中时,Activity(Fragment)直接作为View层,它负责UI相关操作,建立UI元素与Presenter的关联,同时自己也会处理一些简单的逻辑(复杂的逻辑交由Presenter处理)。

  • 通过MVP可以实现视图(View)与模型(Model)的完全解耦,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理。

这里我们可以知道MVP和MVC有这样的关系:
MVP解决了MVC在业务需求以及复杂酷炫UI不断增加的背景下产生一些问题,MVP基于MVC,是MVC的增强版。

MVP与MVC主要差异

  • MVP实现了View与Model的完全解耦,MVC中View可以与Model直接交互。
  • MVP中P与View的交互通过接口进行的,有利于降低耦合,方便进行单元测试;MVC中C与View直接交互,高耦合,不方便进行单元测试。

MVP几个角色以及对应的职责

在MVP模式里通常有以下这几个角色:

  1. View:负责绘制UI元素、与用户进行交互。通常是指Activity、Fragment或某个View空间;
  2. View interface:需要View实现的接口,Presenter通过View interface与View进行交互,降低耦合,方便进行单元测试;
  3. Model:主要是提供数据的存取功能以及操纵功能;可以简单的理解为Model层封装了数据库DAO以及网络获取数据的角色。
  4. Model interface:与View interface作用类似,根据需求的复杂程度,决定是需要增加Model interfac。
  5. Presenter:主要作为沟通View和Model的桥梁,它从Model层检索数据后,返回给View层,使得View层和Model层之间没有耦合,也将业务逻辑从View角色上抽离出来。
MVP模式图例

Presenter与Activity、Fragment的生命周期

在Activity被销毁之前,Presenter持有了Activity强引用并在执行一些耗时操作,导致Presenter一直持有Activity对象,使得Activity对象无法被回收,此时就发生了内存泄露。

如何解决这个样的问题?
Presenter由持有Activity强引用改成弱引用,并在Activity生命周期方法onDestroy中解除关联。
为什么是弱引用?因为Activity生命周期方法onDestroy不一定会被执行到,一旦发生这情况,弱引用也能够保证不会发生内存泄露。

小结

理想化的MVP模式可以实现一份逻辑代码搭配不同的显示界面,因为他们之间并不依赖于具体,而是依赖于抽象。这使得Presenter可以运用于任何实现了View逻辑接口的UI,使之具有更广泛的适用性,保证了灵活度。

MVP并不是一个标准化的模式,它有很多种实现方式,我们可以根据自己的需求和 自己认为对的方式去修正MVP方式,它可以随着Presenter的复杂度变化。只要保证我们是通过Presenter将View和Model解耦合、降低类型复杂度,各个模块可以独立测试、独立变化,这就是正确的方向。

从整体效果来说,MVP是开发过程中非常值得推荐的架构模式,它能够将各组件进行解耦,并带来良好的扩展性、可测试性,稳定性,可维护性,同事使得每个类型的职责相对单一、简单,避免了大量的"胖"的程序存在,例如数千行的Activity类。它有效的将业务逻辑、数据处理等工作从Activity等View元素中抽离出来,使得每个类尽可能简单,同时每个模块能够独立进行演化,它的思想也非常好地体现了面向对象的设计原则:抽象、单一职责、最小化、低耦合。


MVX

GUI应用程序:拥有图像界面的程序

先搞清楚一个顺序,是GUI应用程序的出现导致了MVC的产生。

有了View和Model的分层,那么问题就来了:View如何同步Model的变更,View和Model之间如何粘合在一起。(所谓的MVX中的X都可以归纳为对这个问题不同的处理方式)

M(Model)

Model层表示数据模型和业务逻辑,它代表着一类组件(components)或类(class),这些组件或类可以向外部提供数据,同时也能从外部获取数据并将这些数据存储在某个地方。

model层主要负责:

  • (检索数据)从网络,数据库,文件,传感器,第三方等数据源读写数据。

  • (操纵数据)对外部的数据类型进行解析转换为APP内部数据交由上层处理。

  • (存储数据)对数据的临时存储,管理,协调上层数据请求。

V(View)

在Android中View层一般是Activity、Fragment、View(控件)、ViewGroup(布局等)等。Android中视图包含着用户界面和界面逻辑。

view 层主要负责:

  • 提供UI交互

X(C-Controller、P-Presenter、VM-ViewModel)

Controller控制器

Presenter

ViewModel视图模型

summary

MVC模式、MVP模式和MVVM模式都作为用来分离UI层与业务层的一种开发模式。这些模式之间的差异可以归纳为对这个问题处理的方式的不同。

参考:
http://www.jianshu.com/p/9a6845b26856
http://blog.csdn.net/vector_yi/article/details/24719873?utm_source=tuicool&utm_medium=referral

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

推荐阅读更多精彩内容