zoukankan      html  css  js  c++  java
  • MVP架构

    一、介绍

      MVP(Model View Presenter)架构是从著名的MVC(Model View Controller)架构演变而来的。对于在Android应用中开发就可以视为是MVC架构,布局文件视为View,Activity视为Controller,但是Activity还要控制布局的更新,所以说Activity是Controller与View的合体,这样的结果是Actiivty的代码很多也很杂乱,而MVP就是将Activity充当的Controller与View的角色分割开来。
      View:对于View层也是视图层,在View层中只负责对数据的展示,提供友好的界面与用户进行交互。在Android开发中通常将Activity或者Fragment作为View层。
      Model:对于Model层也是数据层。它区别于MVC中的Model,在这里不仅仅只是数据模型。在MVP架构中Model它负责对数据的存取操作,例如对数据的读取,网络的数据请求等。
      Presenter:对于Presenter层也是连接View层与Model层的桥梁并对业务逻辑进行处理。在MVP架构中Model与View无法直接进行交互。所以在Presenter层它会从Model层获得所需要的数据,进行一些适当的处理后交由View层进行显示,这样通过Presenter将View与Model进行隔离,使得View和Model之间不存在耦合,同事也将业务逻辑从View中抽离。

      在MVP架构中将这三层分别抽象到各自的接口当中。通过接口将层次之间进行隔离,而Presenter对View和Model的相互依赖也是依赖于各自的接口。这点符合了接口隔离原则,也正是面向接口编程。在Presenter层中包含了一个View接口,并且依赖于Model接口,从而将Model层与View层联系在一起。而对于View层会持有一个Presnter成员变量并且只保留对Presenter接口的调用,具体业务逻辑全部交由Presnter接口实现类中处理。

    二、好处

      1.View与Model并不直接进行交互,而是通过Presenter连接彼此。View中不存在Model,从而也不会存在业务逻辑。
      2.Presenter与View的交互式通过接口来实现的,耦合度低,也有利于单元测试。
      3.Presenter是基于行为的,一个Presnter可用于多个View,增强了代码复用。

    三、使用

      使用MVP架构来实现一个ListView的显示。
      1.定义一个Mode接口

    public interface IMode {
        List<String> getDatas();
    }

      2.定义一个IView接口

    public interface IView {
    
        void showProgress();
    
        void hideProgress();
    
        void showText(String text);
    
        void showDatas(List<String> datas);
    
        void showToast(String message);
    
    }

      3.定义一个Presenter接口

    public interface IPresenter {
    
        void getDataList();
    
        void onItemClick(int position);
    }

      4.定义MainMode类实现IMode接口

    public class MainMode implements IMode {
        @Override
        public List<String> getDatas() {
            List<String> datas = new ArrayList<>();
            //return datas;
            datas.add("A");
            datas.add("B");
            datas.add("C");
            datas.add("D");
            datas.add("E");
            datas.add("F");
            return datas;
            //return null;
        }
    }

      5.定义MainPresenter类实现IPresenter接口

    public class MainPresenter implements IPresenter {
    
        private IView mView;
        private IMode mMode;
    
        public MainPresenter(IView mView) {
            this.mView = mView;
            mMode = new MainMode();
        }
    
        @Override
        public void getDataList() {
            mView.showProgress();
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    List<String> datas = mMode.getDatas();
                    mView.hideProgress();
                    if (datas == null) {//获取数据失败
                        mView.showText("请求数据失败!");
                    } else {//获取数据成功
                        if (datas.size() == 0) { //数据为空
                            mView.showText("数据为空!");
                        } else {
                            mView.showDatas(datas);
                        }
                    }
                }
            }, 2000);
        }
    
        @Override
        public void onItemClick(int position) {
            mView.showToast(String.format("Position %d clicked", position + 1));
        }
    }

      6.定义MainActivity类实现IView接口

    public class MainActivity extends AppCompatActivity implements IView, AdapterView.OnItemClickListener {
    
        private ListView mListView;
        private ProgressBar mProgressBar;
        private TextView mTextView;
    
        private IPresenter mPresenter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mListView = (ListView) findViewById(R.id.list);
            mProgressBar = (ProgressBar) findViewById(R.id.progress);
            mTextView = (TextView) findViewById(R.id.text);
            mPresenter = new MainPresenter(this);
            mPresenter.getDataList();
        }
    
        @Override
        public void showProgress() {
            mProgressBar.setVisibility(View.VISIBLE);
            mListView.setVisibility(View.GONE);
        }
    
        @Override
        public void hideProgress() {
            mProgressBar.setVisibility(View.GONE);
            mListView.setVisibility(View.VISIBLE);
        }
    
        @Override
        public void showText(String text) {
            mProgressBar.setVisibility(View.GONE);
            mListView.setVisibility(View.GONE);
            mTextView.setVisibility(View.VISIBLE);
            mTextView.setText(text);
        }
    
        @Override
        public void showDatas(List<String> datas) {
            mListView.setAdapter(new ArrayAdapter<>(this, R.layout.simple_list_item, datas));
        }
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            mPresenter.onItemClick(position);
        }
    
        @Override
        public void showToast(String message) {
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
        }
    }


    代码地址:https://github.com/ZhangMiao147/FrameworkDemo

    参考文章
      http://www.lai18.com/content/7010875.html
      http://www.lai18.com/content/2453405.html
      http://www.lai18.com/content/475341.html
      http://www.lai18.com/content/24630178.html
      http://www.lai18.com/content/719388.html
      http://www.lai18.com/content/7017296.html

  • 相关阅读:
    关于DB2 ORACLE MYSQL 数据库 where字句执行顺序问题
    关于图片上传的一些问题
    集合、迭代器的一些总结
    关于使用Echart记录
    DB2序列的使用
    (转载)判断浏览器类型是否IE及版本问题
    SQL中 IS NULL 和IS NOT NULL
    JS 中substr 和 substring
    (转载)身份证验证
    Echars 自适应浏览器大小
  • 原文地址:https://www.cnblogs.com/zhangmiao14/p/7087097.html
Copyright © 2011-2022 走看看