Android架构--MVC、MVP、MVVM

前言

MVC、MVP、MVVM是当下Android开发中主要的项目架构,当你开发一个app时,合理的软件架构有利于后期的维护。Android开发中我们可以选择的架构只有以上三种,三种架构各有优缺点,我们可以从中选择最合适我们的架构。

MVC

MVC(Model-View-Controller)是最常见的软件架构之一,也是我们刚开始做Android开发选用的架构。


数据关系为:

  • View接收用户交互指令
  • View将指令传递给Controller
  • Controller执行相关的业务逻辑,并操作Model进行数据更新
  • Control更新数据完毕后,Model通知View更新数据变化
  • View更新数据,更新界面
在Android中

那么具体到Android项目中呢?我们知道在一个Android项目中,有java目录下的class文件,也有res目录下的各种资源,layout里面的xml文件就对应于MVC的view层,里面都是一些view的布局代码。而各种java bean,还有就对应于model层,至于controller层嘛,当然就是各种activity或者Fragment了。

  • 通俗一点说,比如你按下了界面上的一个Button,Button是在xml里进行布局的,所以接收交互响应的是在View里,你按下Button的反应,比如网络请求,HttpHelper类就是Model了,那怎么连接这两层呢,我们是通过btn.setOnClickListener()连接的,这个是写在Activity里面的,既是在Controller层了。
  • 这里还要补充一点,Model进行数据更新完毕后,通知View进行数据更新,一般来说是通过观察者模式进行更新的。在上面的三角关系中,一个Model可能对应着多个View,通过观察者,所有注册的View都能接收到更新。例如,在我们在使用ListView的时候,更新数据是通过Adapter的notifyDataSetChanged()方法进行数据更新,如果你跟进BaseAdapter的代码,你就会发现,它还是通过观察者模式更新数据。
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
//数据观察者
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public boolean hasStableIds() {
        return false;
    }
    
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }
    
    /**
     * Notifies the attached observers that the underlying data has been changed
     * and any View reflecting the data set should refresh itself.
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }
}
缺点

在Android开发中,MVC大家肯定会用,但是这种模式有什么区缺点吗,肯定是有的,要不然也不会有后来的MVP、MVVM了不是。大家可以想想,xml作为View层,控制能力太弱了,比如我们要更换了背景,更换个字体颜色,xml中式无法完成的,你只能写在Activity中,这样就使得作为Controller层的Activity,也充当起了View的角色,最终结果使得Activity代码过于臃肿,我在开发的过程中,稍微复杂一点的界面,Activity可以达到2000+行代码,这样的代码维护起来相信谁都会感到头痛吧。

MVP

MVP作为MVC模式的演化,解决了MVC模式的一些缺点。可以看到,View层和Model层不能直接进行通信了,转而交给Presenter层作为中间的代理。其中Model层和MVC是一样的,但是Activity和Fragment则是纯粹的View层了,不再充当Controller的角色了。所有的交互事件交给Presenter层处理。


数据关系为

  • View接收用户交互请求
  • View将请求提交给Presenter层
  • Presenter层操作Model进行数据更新
  • Model层通知Presenter层数据发生变化
  • Presenter层操作View层界面更新
    这样实际上将View层和Model层解耦了。
    在Android中
  • 对于View,一般要有个IView的接口,Activity或者Fragment要实现这个接口。此接口主要是有关界面的操作,如下栗子中,获取EditText的输入值,显示Toast,显示和隐藏ProgressBar等。
public interface ILoginView {
        String getUserName();
        String getPassWord();
        void showToast(String content);
        void closeDispose(Disposable disposable);
        void showProgress();
        void hideProgress();
        void toOtherActivity();
    }
}

`
public class LoginActivity extends BaseActivity implements IView.ILoginView {}

  • 对于Model,一般要有一个IModel,Model要继承这个接口
public class IModel {
    public interface ILoginModel {
        void login(LoginBody loginBody, MyCallBack<UserLoginBean> callBack); //登录
    }

}

public class LoginModel implements IModel.ILoginModel {}

MVVM

可以看到,和MVP比较,presenter层换成了viewmodel层,其实view层和viewmodel层是相互绑定的关系,这意味着当你更新viewmodel层的数据的时候,view层会相应的变动ui。



数据关系:

  • View接收交互请求
  • View将请求提交给ViewModel
  • ViewModel操作Model进行数据更新
  • Model更新完数据,通知ViewModel数据发生变化
  • View和ViewModel是双向绑定的关系,ViewModel变化,View层会相应变化

所以MVVM模式一般要结合Google推出的DataBinding,将View和ViewModel层进行数据绑定。

关于MVP和MVVM的例子,以后会给出。

最后

任何的项目框架,都是为项目服务的。没有绝对的好坏之分,只有更合适的选择。在项目进展的不同阶段,做出最合适的调整,才是是更适合团队项目发展的框架。

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

推荐阅读更多精彩内容