欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MVP模式使用总结

程序员文章站 2024-03-15 19:29:06
...

资料

前言

从认识mvp模式,学习,开始使用mvp模式到现在也有一年多的时间了。这一年时间里,无论是自己要做一些Android的小玩意还是做项目,最先考虑的就是要不要用mvp模式开发。学了这么久的MVP模式,这次趁现在还有点空余时间,就好好做一个小结。

为什么要使用MVP模式

我们在设计软件的框架的时候,我们需要考虑很多因素,如

  • 代码解耦
  • 结构是否清晰
  • 代码是否可复用
  • 有没有具备扩展性
  • 是否方便进行单元测试

现在我了解到的主流框架有MVC模式,MVP模式,MVVM模式。而MVC模式本来就是Android本身所采用的模式,想要了解可以看Android之MVC设计模式在Android中的使用,而MVP模式是对MVC模式的进一步演化
MVP模式使用总结
MVC模式图解
MVP模式使用总结
mvp模式图解
从图解可以看出,View层不在和Model直接交互,而是同过Presenter,而Presenter与View之间通过定义接口实现交互,View层与Model之间完全解耦。对于MVVM模式,现阶段对该模式了解不太深,不敢下笔,以免误导他人。


如何实现

我写了一个简单的Demo,放在github上
MVP模式使用总结
逻辑解释:View层按钮发起获取请求,调用Presenter的获取数据接口,Presenter层调用Model层的获取数据接口,Model层中通过延时操作模拟获取数据过程,然后通过回调调用Presenter层的获取成功接口,最后Presenter层调用View的显示数据接口

代码结构
MVP模式使用总结

  • base包:这里放置BaseActivity,BaseActivity的抽象类
  • listener:Model获取数据成功后的回调方法,在Presenter层中引用接口
  • main:就是当前页面的一些内容
  • mvp:里面的MainContract定义了View和Presenter所要用到的接口
  • model:这里面存放的就是Model层的东西了

BaseActivity.java

public abstract class BaseActivity<T extends BasePresenter> extends Activity {

    protected T presenter;

    @Override
    public void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        setContentView(getLayout());
        init();
    }

    protected abstract void init();
    public abstract int getLayout() ;
}

BasePresenter

import android.view.View;
public abstract class BasePresenter<T extends BaseActivity>{
    protected T view;
}

MainModel

public class MainModel {
    public void getData(String s,MainListener mainListener){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        mainListener.onSuccess("获取成功");
    }
}

这里使用延时操作模拟获取数据过程,也就是我们平时访问网络资源的过程,然后通过回调MainListener通知Presenter
MainListener


public interface MainListener {
    void onSuccess(String s);
    void onfail();
}

回调接口在Presenter中实现
MainPresenter

public class MainPresenter extends BasePresenter<MainActivity> implements MainContract.Presenter,MainListener{

    private MainModel mainModel;
    public MainPresenter(MainActivity mainActivity){
        this.view = mainActivity;
        mainModel = new MainModel();
    }
    @Override
    public void getData() {
        mainModel.getData("结果ok啦",this);
    }

    @Override
    public void onSuccess(String s) {
        view.showResult(s);
    }
    @Override
    public void onfail() {

    }
}

Contract定义的接口
MainContract

public interface MainContract {
    interface View {
        void showResult(String s);
        void showFail(String s);
    }
    interface Presenter{
        void getData();
    }
}

然后就是Activity要引用定义好的接口,以及继承BaseActivity
BaseActivity

public class MainActivity extends BaseActivity<MainPresenter> implements MainContract.View {


    private Button button;

    @Override
    protected void init() {
        presenter = new MainPresenter(this);
        button = findViewById(R.id.getdata_bt);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                presenter.getData();
            }
        });
    }

    @Override
    public int getLayout() {
        return R.layout.activity_main;
    }

    @Override
    public void showResult(String s) {
        Toast.makeText(this,s,Toast.LENGTH_LONG).show();
    }

    @Override
    public void showFail(String s) {

    }
}

如上,activity中只做界面显示的逻辑,不做其他操作。整个类变得清晰易阅读。

最后吧唧几句

以上基本是MVP模式实现的基础代码了,整个项目的架构也应该是能够清楚的表达出来了吧。代码之间的耦合程度降低了,测试也变得更加方便。现在想想以前没有考虑过架构写代码的日子,一个Activity中包含了各种逻辑代码,整个类变得臃肿难懂。特别是需求易变的情况下,更是各种伤神动脑。由此看出一个良好的架构对开发人员是多么重要。

Live and Lrean!