Android之MVP架构设计

MVC架构属于传统模式,在团队合作开发中最常用的就属MVP了,谷歌官方也提供了参考demo可见其重要之程度。

MVP相比较于MVC优点有哪些:

  • 低耦合,Controller层不在混合有View层的逻辑
  • MVP是面向接口编程,对于代码量较大的APP来说,相比较合作开发的优势就体现出来了,每个人或每个团队只负责一块逻辑,责任分明
  • 在MVP架构中,View层和Model层不直接交互,而Presenter层持有View层和Model层的逻辑,Presenter充当作为中间人角色,为二者提供逻辑处理
  • 在View层(通常是Activity中)拿到Presenter的对象,而Presenter持有Model层的对象,并从Model层取到数据,传递给View

缺点:

  • Model进行异步操作,获取结果通过Presenter回传View时,可能会出现View引用的空指针
  • Presenter和View互相持有引用,解除不及时会造成内存泄漏
  • 因此,在进行MVP架构设计时需要考虑Presenter对View进行回传时,View是否为空

下面是代码实现一个简单的MVP架构:

思路:当点击View中的一个按钮时,Model层给View传递一个String类型的字符串

1、定义出所MVP架构可能用到的所有接口

public interface TestContract{

    interface Presenter{
        void getInfo();//获取数据方法
    }

    interface View{
        void showInfo(String str);//显示数据方法
    }

    interface Model{
        String serveInfo();//提供数据方法
    }

}

2、实现Presenter(所有的业务操作都在Presenter的实现类中来完成,一来方便后期管理和维护,而是方便后期功能的增删)

public class PresenterImpl implements TestContract.Presenter{

    TestContract.View view;
    TestContract.Model model;
    
    public PresenterImpl(TestContract.Model model,TestContract.View view){
        
    this.view=view;
    this.model=model;
    }

    @Override
    public void getInfo(){
        view.showInfo(model.serveInfo());
    }
}

3、实现Model层,同时获取数据

public class ModelImpl implements TestContract.Model{
    
    TestContract.Model model;
    public static ModelImpl getInstance(){
        if(model==null){
            model=new ModelImpl();
        }
        return model;
    }

    @Override
    public String serveInfo(){
        
        return "transport info";
    }
}

3.View层的代码逻辑,在Activity中实现View层接口,拿到Presenter的引用从而获取Model的数据

public class TestActivity extends AppCompatActivity implements TestContract.View{
    private TestContract.Presenter presenter;

    public PresenterImpl(ModelImpl.getInstance,this);
        
    //按钮的点击事件逻辑处理
    public void onClick(View view){
        presenter.getInfo();
    }

    @Override
    public void showInfo(String str){
        tv.setText(str);
    }

}

以上是MVP架构的基本用法,在实际工程中,Model层不是必须的,但是一定得有Presenter跟View

在后续开发中,Model层中可以有多种获取数据的方法(或者写出多个Model层,用以处理不同类型的数据),Presenter中可以有实现的多个方法用以持有不同Model的不同方法(或者同一Model的不同方法),总之就是不要将View与Model直接交互即可。

猜你喜欢

转载自blog.csdn.net/weixin_38664232/article/details/84304269
今日推荐