android开发系列之MVP设计模式

      最近在开发一个android的项目中,发现了一个很实用的设计模式(MVP)。大家可能一看到这个名字就有点蒙,MVP到底是什么鬼呢?它的好用到底体现在哪呢?别着急,下面就让我们一一分享出来。

      说到MVP,大家也许就会想到MVC。没错,其实他们两者之间确实有很大的联系,MVC相比大家都是非常的熟悉了,典型的三层框架。但是MVC在使用的过程中有什么弊端呢?就我自己的理解是它会导致Control层和Model层衔接太紧密,因为有的时候你必须从Model里面读写数据。而MVP 呢?它是在Model和View之间加了个Presenter层,所有的交互都发生在Presenter层里面。看到这里,有的人就会说了,那这不是跟MVC一样的吗?我看不出有什么区别呀?下面就让我们来看看实际代码,也许你就能领悟出一些东西了。

      假如我前台有这么个Activity,代码如下:

public class MyTestActivity extends Activity implements View.OnClickListener {

    private Button btnTest1,btnTest2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_test);

        initView();
        setClickLinear();
    }

    private void initView(){
        btnTest1=(Button)findViewById(R.id.btnTest1);
        btnTest2=(Button)findViewById(R.id.btnTest2);
    }

    private void setClickLinear(){
        btnTest1.setOnClickListener(this);
        btnTest2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.btnTest1:

                break;
            case R.id.btnTest2:

                break;
        }
    }

    private void showButton1(){
        btnTest1.setVisibility(View.VISIBLE);
    }

    private void hiddenButton1(){
        btnTest2.setVisibility(View.GONE);
    }

    private void showButton2(){
        btnTest2.setVisibility(View.VISIBLE);
    }

    private void hiddenButton2(){
        btnTest2.setVisibility(View.GONE);
    }
}

 你可以看到在这段代码里面,我只是想要简单的实现:点击按钮1的时候隐藏按钮2,点击按钮2的时候隐藏按钮1;其实逻辑是很简单的,我们只需要分开定义好四个方法就可以了。但是如果我现在假如该activity里面还有其他需求:1.我想要页面一启动的时候就请求4张广告图片;2.中间有个gradview需要你去填充9宫格;3.需要根据用户类型显示不同的级别内容;这样一想的话,我们有可能就开始按照需要啪啪啪在Activity里面定义好相关的方法,然后再加上一个AsyncTask用于后台http请求,没错这是常用的思维逻辑。但是我们现在好好地来分析一下就会发现,Activity里面堆积的东西太多了,有没有什么办法能够给它瘦身呢?这个时候就轮到MVP闪亮登场了。请看下面的代码:

public interface ITestMVP {

    void showButton1();
    void showButton2();
    void hiddenButton1();
    void hiddenButton2();
}

 首先我们定义一个接口,用于提供Activity里面所需要用到的方法协议。然后我们需要在该Activity实现这个接口,类定义如下:

public class MyTestActivity extends Activity implements View.OnClickListener,ITestMVP {
    
    @Override
    public void showButton1() {

    }

    @Override
    public void showButton2() {

    }

    @Override
    public void hiddenButton1() {

    }

    @Override
    public void hiddenButton2() {

    }
}

 可以看到我们这个时候就应该在Activity里面重写如上四个方法,最后一步就应该将Presenter定义出来。其实Presenter的最主要的作用就是分离Activity UI层的操作和后台代码的耦合性。请看Presenter代码:

public class TestMvpPresenter {

    private ITestMVP iTestMVP;

    public TestMvpPresenter(ITestMVP iTestMVP) {
        this.iTestMVP = iTestMVP;
    }

    public void Button1Click(){
        iTestMVP.showButton1();
        iTestMVP.hiddenButton2();
    }

    public void Button2Click(){
        iTestMVP.showButton2();
        iTestMVP.hiddenButton1();
    }
}

 这个时候你会发现,其实所有的相关操作我们都已经提炼到Presenter里面。这样的话,我就不仅将UI和Model分开了,同时如果有其他相关的操作,我们还可以定义其他的Adapter。从而通过Presenter粘合多个处理逻辑的功能。同时如果我们在多个页面之间是相同的处理逻辑的话,那么就以为我们可以共用同一个Presenter。是不是很简单呢?最后让我们来看看,在Activity的onCreate方法里面调用的代码:

TestMvpPresenter testMvpPresenter=new TestMvpPresenter(this);

       好了,今天就到这吧!如有不对,欢迎拍砖。

原文地址:https://www.cnblogs.com/xiaocai20091687/p/android-xiaocai-mvl.html