三种软件架构的框架(设计的典范)各自有什么特点?有什么区别?
一、MVC
1.组成及作用
- Model:模型(提供并处理数据)
- View:视图(渲染界面,数据可视化)
- Controller:控制器(MV的连接器,负责用户交互,控制程序流程和业务逻辑的处理)
2.工作原理
当用户触发事件的时候,view层发送指令到controller层,接着controller去通知model层更新数据,model层更新完数据以后直接显示在view层上
android中对应:
Model(网络请求、JavaBean类)-View(xml文件)-Controller(activity、fragment)
缺点: 中小型项目不适用
- xml作为view层,控制能力太弱了。此时Activity既是Controller又是View,代码量太多。View和Model耦合度太高,不易于维护。
二、MVP
1.组成及作用
- Model:模型(提供数据)
- View:视图(数据可视化)
- Presenter/Controller:控制器、提出者(处理数据、负责用户交互)
2.工作原理
当用户触发事件的时候,View通过接口将事件传递给Presenter处理,Presenter处理完再通过接口把数据交给Model。
android对应:
Model(JavaBean类)-View(xml文件、activity、fragment)-Presenter/Controller(单独类:逻辑处理几网络请求)
Presenter作为Model和View的桥梁,MV解耦了。
View与Presenter通信是接口实现的,我们的activity,fragment去实现实现定义好的接口,而在对应的Presenter中通过接口调用方法。
优点:
- View层和Model层完全分离,只负责自己的活。
缺点: 中小型项目不适用
- View与Presenter耦合度较高,View变更了,Presenter也要变更。
- 逻辑很复杂的页面,你的接口多时维护接口的成本就会非常的大。可以抽取公共逻辑定义成基类。
三、MVVM
ps:AS中有快捷生成方式,需要导入一个jar。
1.工作原理:
重点在于实现了“VM数据模型与View数据通过Binder双向数据绑定”,Model和ViewModel之间的交互是双向的,因此View视图的数据的变化会同时修改数据源,而数据源数据的变化也会立即反应到View视图上。
页面数据需要更新时不用再调用setText了。只要string这个变量一更新,Textview就会自动显示更新后的值,这就是数据绑定。
android对应:
Model(…)-View(…)-ViewModel(…)
优点:
- 低耦合,View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
- 可重用性,可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
- 可测试 ,测试可以针对ViewModel来写。
2.★MVVM实例:
[1] 架构目录:

[2] 构建步骤:
0)build gradle (mudule:app)中添加dataBinding
android{
//dataBinding 数据绑定:model更新后通过databinding直接更新到view,viewModel不需要做操作
dataBinding{
enabled true
}
}
1)创建ViewModel类,成员变量Model,构造传入ViewDataBinder、View。
public class LoginViewModel {
private ViewDataBinding binding;
private LoginFragment fragment;
/*model一定是public,不然xml拿不到*/
public LoginModel model;
public LoginViewModel(LoginFragment fragment,ViewDataBinding binding){
model=new LoginModel("无人的海边","123456");
this.fragment=fragment;
this.binding=binding;
}
2)在layout文件(.xml)中 添加根节点和data,指定对应ViewModel。Rebuild Project 自动构建DataBinder类。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data class="LoginBinding">
<variable
name="loginVModel"
type="com.ltt.rabbitwarehouse.mvvm.viewmodel.LoginViewModel" />
</data>
<LinearLayout...>
...
</LinearLayout>
</layout>
3)在ViewModel 构造中 绑定xml中的ViewModel和View,创建要绑定的方法
public LoginViewModel(LoginFragment fragment,ViewDataBinding binding){
...//此处代码上文已有
//绑定xml中ViewModel和View
this.binding.setVariable(com.ltt.rabbitwarehouse.BR.loginVModel,this);
}
public void login(View view){
Toast.makeText(fragment.getContext(),"已登录",Toast.LENGTH_SHORT).show();
}
public void autoInfo(View view){
//按钮的点击方法,点击改变model值,view会自动更新
model.setAccount("张三");
}
4)在layout文件(.xml)中 属性绑定 @={属性} 、方法绑定 @{方法}
<LinearLayout>
<EditText
android:hint="请输入账号"
android:text="@={loginVModel.model.account}"/>
<EditText
android:hint="请输入密码"
android:text="@={loginVModel.model.password}"/>
<Button
android:text="登录"
android:onClick="@{loginVModel.login}"/>
<Button
android:text="自动填写"
android:onClick="@{loginVModel.autoInfo}"/>
</LinearLayout>
5)在ViewModel中监听属性的变化
//监听模型数据的变化
model.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
@Override
public void onPropertyChanged(Observable sender, int propertyId) {
if(propertyId == com.ltt.rabbitwarehouse.BR.account){
Toast.makeText(fragment.getContext(),"切换其他账户",Toast.LENGTH_SHORT).show();
}
}
});
最终效果:点击自动填写改变model值,通过数据绑定动态改变了view内容

参考文档:
https://blog.csdn.net/chaoshenzhaoxichao/article/details/79871145
https://blog.csdn.net/qq_41872247/article/details/102981466
https://blog.csdn.net/victoryzn/article/details/78392128
https://yuzhiqiang.blog.csdn.net/article/details/79082234
https://www.jianshu.com/p/fe30044d2bd2 通俗易懂MVVM!
本文详细介绍了Android中三种常见的软件架构模式:MVC、MVP和MVVM。分别阐述了它们的组成、工作原理以及在Android应用中的具体实现。在MVVM中,特别强调了双向数据绑定的优势,并提供了简单的实现步骤,以帮助开发者理解如何在实际项目中应用MVVM架构。

1695

被折叠的 条评论
为什么被折叠?



