赞
踩
1.三个基本架构
在Android中,开发架构就是描述视图层、逻辑层、数据层三者之间的关系和实施。
Android中有3个基本的架构模式。
①MVC(Model-View-Controller)
Model:模型层,代表数据模型,用于获取和存储数据。
View:视图层,即呈现给用户的UI,即xml布局文件。
Controller:控制层,负责处理用户与app之间的交互,包含业务逻辑。是Model与View的桥梁,用来控制程序的流程,比如Activity/Fragment。
View层接收到用户操作事件,通知到Controller进行对应的逻辑处理,然后通知Model去获取/更新数据,Model再把新的数据通知到View更新界面。这就是一个完整MVC的数据流向。
但在Android中,因为xml布局能力很弱,View的很多操作是在Activity/Fragment中的,而业务逻辑同样也是写在Activity/Fragment中。
所以,MVC的缺点如下:
1)Activity/Fragment责任不明,同时负责View、Controller,就会导致其代码量大,不满足单一职责。
2)Model耦合View,View的修改会导致Controller和Model都进行改动,不满足最少知道原则。
②MVP(Model-View-Presenter)
Model:模型层,代表数据模型,包括数据和一些业务逻辑,即数据的结构定义、数据的存储和获取等。
View:视图层,即呈现给用户的UI,并且负责与客户进行交互。包括Activity/Fragment。
Presenter:主持者,负责业务逻辑。Presenter通过View接收用户的输入,然后在Model的帮助下处理用户的数据并将结果传递回View。Presenter通过接口与View进行通信。接口在presenter类中定义,它传递所需的数据。Activity/Fragment及其他View视图组件实现此接口获得他们想要的数据并呈现数据。
View层接收用户操作事件,通知到Presenter,Presenter进行逻辑处理,然后通知Model更新数据,Model把更新的数据给到Presenter,Presenter再通知到View更新界面。
MVP的实现思路:UI逻辑抽象成IView接口,由具体的Activity实现类来完成,并调用Presenter进行逻辑操作。业务逻辑抽象成IPresenter接口,由具体的Presenter实现类来完成。逻辑操作完成后调用IView接口方法刷新UI。
MVP本质是面向接口编程,实现了依赖倒置原则。
MVP解决了MVC的问题:
1)View责任明确,逻辑不再写在Activity中,而是在Presenter中;
2)Model不再持有View,将View与Model解耦。
但是MVP并没有解决代码耦合的问题,View和Presenter之间相互持有。
所以MVP的缺点如下:
1)会引入大量的IView、IPresenter接口,增加实现的复杂度。
2)View和Presenter相互持有,形成耦合。
3)Presenter如果持有Activity等的引用,容易出现内存泄露问题。
③MVVM(Model-View-ViewModel)
Model:模型层,代表数据模型,包括数据和一些业务逻辑,即数据的结构定义、数据的存储和获取等。
View:视图层,即呈现给用户的UI,并且负责与客户进行交互。比如XML/Activity/Fragment。
ViewModel:视图模型,负责业务逻辑。它解决了MVP的问题,使ViewModel和View之间不再依赖接口通信,而是通过LiveData、RxJava、Flow等响应式开发的方式来通信,即将数据以可观察对象的形式提供给View,View和ViewModel层分离,ViewModel不应该知道与之交互的View是什么。
在MVVM中View持有ViewModel,View产生事件,使用ViewModel进行逻辑处理后,通知Model更新数据,Model把更新的数据给ViewModel,ViewModel自动通知View更新界面,而不是主动调用View的方法。
MVVM的本质是数据驱动,把解耦做的更彻底,viewModel不持有view 。
在MVVM中View持有ViewModel,但ViewModel得不到任何关于View的信息。所以View与ViewModel之间存在着一对多的关系,一个View可以持有多个ViewModel。MVVM是MVP模式的一个优化。
2.三个架构模式举例
分别用MVC、MVP、MVVM模式实现一个用户登录的功能。
①MVC
(1)Controller层:
public class MvcLoginActivity extends AppCompatActivity {
private EditText userNameEt;
private EditText passwordEt;
private User user; //view层依赖了Model层
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.activity_login);
user = new User();
userNameEt = findViewById(R.id.name);
passwordEt = findViewById(R.id.pwd);
Button loginBtn = findViewById(R.id.lgin);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
login( userNameEt.getText().toString(), passwordEt.getText().toString());
}
});
}
private void login(String userName, String password) {
if (userName.equals("admin") && password.equals("123")) { //业务逻辑
user.setUserName(userName);
user.setPassword(password);
Toast.makeText(this, userName + " Login Successful", Toast.LENGT
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。