• 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);
    

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

  • 相关阅读:
    2017微软秋招A题
    UVA 494 Kindergarten Counting Game
    loss function与cost function
    coderforces 721b
    coderforces719b
    PyQt4打包exe文件
    PyQt4 UI设计和调用 使用eric6
    PyQt4 进度条和日历 代码
    PyQt4 颜色选择,字体选择代码
    PyQt4调用UI文件
  • 原文地址:https://www.cnblogs.com/xiaocai20091687/p/android-xiaocai-mvl.html
Copyright © 2020-2023  润新知