MVP MVC MVVM概念解析

MVC

Model 数据层(网络数据,数据库,缓存)
View XML布局
Controller 对应于Activity,处理跳转,业务逻辑,处理数据。

这个在android的最基本的设计模式,我用于请求的网络数据,数据库,缓存库封装的类都可以层位model层。activity中会直接持有这些model的引用,xml中处理view视图布局。这种模式在项目变大的时候,会出现activity承担的任务太多,因为它会处理网络请求的调用,数据层,逻辑层,UI层。我们经常遇到这种情况,一个activity中可能会有几千行代码。

MVP

Model 数据层(网络数据,数据库,缓存)
View Activity和XML布局,负责绘制UI和显示UI。
Presenter 负责连接View和Model的交互逻辑

前面说的mac模式中的Controller的activity会出现很多处理逻辑和数据层的代码,mvp就可以解决这个问题。

实现逻辑

  • 响应view
    P也叫Presenter其核心就是通过持有一个抽象的view接口,来操作真正实现这个抽象的view层,一般我们的activity会实现这个抽象的view接口,来响应在Presenter层中的抽象view调用。

  • 获取model
    还有就是把一些操作model层的逻辑也封装了起来,在p层中操作需要的数据层,然后通过view接口实现回调,达到把数据传输到view的实现类也就是Activity。

  • 结论
    好处

  1. 解耦
  2. 复用性好

缺点

  1. view的抽象接口会比较多
  2. 还是有耦合如何view的接口变更响应的实现也全部要变更
  3. 如果P层逻辑太多依然会导致代码臃肿的问题

得到的就是p层是view(activity)和model之间的一个纽带,view和model之间没有任何关系,但是通过实现一个抽象view,传输到p层。p层持有这个抽象view之后就可以把获取的数据通过view抽象回调给实现类了。达到了解耦的操作,还有一个就是如果某个地方有相同的逻辑,还可以直接复用P层。

MVVM

model还是原来的数据层,view是xml和activity。vm就是ViewModel操作封装了业务逻辑和数据操作,配合DataBanding数据库绑定框架,实现以数据驱动改变,实现业务分离。解决MVP出现的接口定义过多,接口一改变全部改变的一些问题。

ViewModel具体实现

  1. 利用DataBanding的xml定义里面有一个ViewModel属性
  2. ViewModel接收一个DataBanDing的对象把VM传入给刚刚定义的属性
  3. xml数据绑定的地方操作vm对象的业务逻辑方法
public class MainViewModel {  
  
    private ActivityMainBinding activityMainBinding;  
    private ContentMainBinding contentMainBinding;  
    private AppCompatActivity activity;  
  
    private UserBean user;  
  
    public MainViewModel(AppCompatActivity activity, ActivityMainBinding activityMainBinding){  
        this.activity = activity;  
        this.activityMainBinding = activityMainBinding;  
        this.contentMainBinding = activityMainBinding.contentMain;  
        init();  
    }  
  
    public void init(){  
        activity.setSupportActionBar(activityMainBinding.toolbar);  
        activityMainBinding.fab.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View view) {  
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)  
                        .setAction("Action", null).show();  
            }  
        });  
        user = new UserBean();  
        contentMainBinding.setViewModel(this);  
  
    }  
  
    public void applyUser(View v){  
        Snackbar.make(v,"提交成功",Snackbar.LENGTH_SHORT).setAction("Action",null).show();  
        user.name.set(contentMainBinding.name.getText().toString());  
        user.sex.set(contentMainBinding.sex.getText().toString());  
        user.age.set(Integer.valueOf(contentMainBinding.age.getText().toString()));  
    }  
  
}

model View ViewModel

Model 数据层(网络数据,数据库,缓存)
View Activity和XML布局,负责绘制UI和显示UI。
ViewModel 通过ViewModel完成model和view的交互

前面说到mvp中会存在一些问题,接口的过多,实现抽象view的地方会有的耦合变更不方便。但是通过ViewModel可以解决这个问题

ViewModel
它的唯一作用和概念就是它只做数据层面的操作,比如网络请求,比如数据库操作。这些操作都可以放在ViewModel中,当我们项目的代码一大的时候就可以看到它的好处了。当然光是这样还不能满足我的期望,这个时候LiveData就上场了。

LiveData
LiveData是一个抽象的数据类,它的主要作用是提供通知给View层做数据刷新。通过LiveData包装的数据类,只要数据集一变更,监听通知的地方就会自动收到数据刷新的回调,可以在Activity中通过observe方法监听一个数据的更新。

通过这个组合发现我们连接口都不需要定义了,而且没有什么接口变更导致实现类也需要变更的情况。我们直接通过LiveData持有一个数据引用数据更新后,自动会在监听的地方会调用数据,然后View层(Activity)的view直接使用数据进行属性UI的操作。

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

推荐阅读更多精彩内容