Android 架构模式

本文深入探讨了Android开发中的三种常见架构模式:MVC、MVP和MVVM。MVC模式中,Activity同时承担View和Controller角色,导致代码耦合度过高。MVP模式通过引入Presenter来分离业务逻辑,但View和Presenter之间仍存在耦合。MVVM模式使用LiveData等响应式工具,实现了View和ViewModel的解耦,提高了代码的可测试性和复用性。通过具体案例展示了如何在实际开发中运用这三种架构模式。
摘要由CSDN通过智能技术生成

1.三个基本架构

在Android中,开发架构就是描述视图层、逻辑层、数据层三者之间的关系和实施。

Android中有3个基本的架构模式。

①MVC(Model-View-Controller)

Model:模型层,代表数据模型,用于获取和存储数据。

View:视图层,即呈现给用户的UI,即xml布局文件。

Controller:控制层,负责处理用户与app之间的交互,包含业务逻辑。是Model与View的桥梁,用来控制程序的流程,比如Activity/Fragment。

View层接收到用户操作事件,通知到Controller进行对应的逻辑处理,然后通知Model去获取/更新数据,Model再把新的数据通知到View更新界面。这就是一个完整MVC的数据流向。

b777d82bbccb4e2c9f2e2bb1f1a54c46.jpg

但在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更新界面。

785172bc130840f99ffa0cb09c66d522.jpg

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的方法。

507f14a06c474998b0f4c5ded0d648ff.jpg

MVVM的本质是数据驱动,把解耦做的更彻底,viewModel不持有view 。

在MVVM中View持有ViewModel,但ViewModel得不到任何关于View的信息。所以View与ViewModel之间存在着一对多的关系,一个View可以持有多个ViewModel。MVVM是MVP模式的一个优化。

 

2.三个架构模式举例

分别用MVC、MVP、MVVM模式实现一个用户登录的功能。

①MVC

59d96930fc52455fb20d0dc02d3c8ecd.png

 (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 + " Log

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值