MVC(M -> Model, V->View, C -> Controller)
Model:数据模型,可以用来操作数据 (比如查询数据库数据,一般是纯java代码写的 不包含android api)
View: 视图 通俗意义上说就是展示给用户看的页面 (在android mvc中 可以理解为 View = R.layout.XXX)
Controller:控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开 (在android mvc中 可以理解为Activity)

如图所示,View的展示需要数据填充,然后就让Controller通知Model去请求数据,请求到数据之后通知view刷新,此时在android中Activity不仅充当了Controller的角色而且还承担部分view的职责



这种架构的缺陷就是随着业务的增多,页面的复杂度变大 Activity 就会变得很臃肿,所以就需要对现有架构进行拆分
拆分方式一 (对view进行拆分)
废话不多说看代码,model不变,增加一个dataview类



这样activity 代码就变得清晰多了
拆分方式二 : 对Controller(Activity)拆分 换句话说就是让activity充当view的角色,把原本Controller的工作单独抽出来 也就是我们所说的 mvp
MVP(M -> Model, V->View, P -> Presenter)
Model:作用与MVC中定义的Model一样
View: 视图 通俗意义上说就是展示给用户看的页面 (在android mvp中 可以理解为Activity)
Presenter:意义与Controller相同,不同的是,在MVC中 Controller 是 一个Activity

此时Activity就是一个view只做一切有关view的操作,业务代码全部放到presenter中,数据层不变,view与model的交互全部交给presenter来完成
老规矩看代码




这只是最基础的mvp 还没有引入接口和泛型
MVVM(M -> Model, V->View, VM -> ViewModel)

基础架构其实还是基于mvc 或者 mvp ,只不过是加了一个 双向绑定功能,(mvc,mvp可以看做是一种设计规范,一种架构思想,而mvvm属于一种设计框架)
继续上代码




也可以通过Jetpack 库中的 DataBinding 来实现数据绑定功能 具体参考databinding
第一次写技术文章,说的有问题欢迎大家指出
网友评论