MVP设计模式的优化与实践

本文探讨了MVP模式在APP开发中遇到的问题,如接口爆炸和维护困难,并提出了采用MVVM模式,利用观察者模式解决这些问题。通过业务逻辑更新Model,而不是直接操作UI,实现了更灵活的代码组织。文中以用户登录为例,展示了如何在实践中应用这一模式,并对可能出现的异步问题进行了优化,提供了一个自定义LiveData的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    APP开发最让人头疼的就是业务逻辑和UI代码混合起来,造成后期APP很难维护,新需求越来越难加入,因为依赖太多了,而且纷繁复杂。后来有人提出MVP模式,既然业务逻辑要依赖UI,那么为什么不把他们之间用一个接口隔离开呢,让业务逻辑依赖UI更新的接口而不管具体的UI是如何更新的,更新UI的具体代码则交给Activity来做。当我们进行实践的时候,问题来了,我们需要定义大量接口,而且看似架构很严谨的MVP模式在实际应用当中变得过于臃肿。好了,既然出现了这个问题,那就得解决,Presenter臃肿,有人单独提出一个Presenter分开成多个并且按功能模块划分,对于Presenter来说这样划分是很合理的。同理ViewModel。 但是IView层就还是老样子,即使我们缩减接口,并用方法参数代替要更新哪个UI也没有解决接口爆炸的问题。而且还有了新的问题,那就是我更新UI的时候Activity我并不知道是否已经走了onDestory。 MVP的设计模式根本问题在于接口爆炸,要想减少接口,那必须让业务逻辑和UI逻辑不依赖同一个接口,那尝试一下让UI依赖Model吧,也就是说不管我们业务逻辑如何变化,最终更新UI我们只需要更新Model,MVVM诞生了。

    我觉得没有必要纠结形式,MVVM其实就是观察者模式,使用观察者代替接口,而被观测的对象就是Model。我们再也不需要在UI需要更新的时候去通知接口了,当需要更新UI的时候直接通知观察者。而观察者保存在Activity当中,并且感知Activity的生命周期变化,这样观察者就可以决定是否要执行UI的更新。

    总结,我们仍然可以使用Presenter来划分我们的业务逻辑,然后当需要更新UI的时候通知观察者,即更新Model来驱动,如此Activity依赖ViewModel注册观察者, Presenter依赖ViewModel通知观察者。我认为,这应该才是MVP最佳的实践。由接口爆炸变成了观察者和被观察者爆炸,但是我们不用严格的遵循必须实现那个定死的更新UI的接口了。我们将每个业务过程当做一个状态机,随着业务流程的进行,model的状态会发生改变,这样我们通过观察者来更新UI就成为了可能, 并且这些状态不是零散的,而是随业务逻辑有规则变化的。

举个简单的demo感受一下新的MVP设计模式,以用户登录为例。

这是我们的Model,我们定义了一个登录状态。

public class MainActivityModel extends ViewModel{
    public static final int LOGIN_START   =  1;
    public static final int LOGIN_SUCCESS =  2;
    public static final int LOGIN_FAIL    = -1;
    public MutableLiveData<Integer> loginState = new MutableLiveData<>();
}

这是我们的Presenter, doLogin模拟了登录请求

public class MainActivityPresenter {

    private MainActivityModel mModel;

    public void registerViewModel(ViewModel model){
        mModel = (MainActivityModel) model;
    }


    public void doLogin(String userName, String userPswd){
        //我们使用一线程来模拟用户登录的网络请求, 这里我们就不处理方法的参数了
        new Thread(new Runnable() {
            @Override
            public void run() {
                mModel.loginState.postValue(MainActivityModel.LOGIN_START);
                try {
                    //与服务器交互耗时2s
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    mModel.loginState.postValue(MainActivityModel.LOGIN_FAIL);
                }
                mModel.loginState.postValue(MainActivityModel.LOGIN_SUCCESS);
            }
        }).start();


    }


}

这是我们的主Activity:完成了拼装,注意看我们是如何处理UI更新的


public class MainActivity extends AppCompatActivity {

    private EditText 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值