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

  • 相关阅读:
    Key-Value Memory Network
    Deep Mask Memory Network with Semantic Dependency and Context Moment for Aspect Level Sentiment Clas
    Deep Memory Network在Aspect Based Sentiment方向上的应用
    Deep Memory Network 深度记忆网络
    Self Attention 自注意力机制
    Attention基本公式及其变种
    *端策略优化算法(PPO)
    Policy Gradient 算法
    一本通 农场派对
    A
  • 原文地址:https://www.cnblogs.com/zhangmiao14/p/7087097.html
Copyright © 2011-2022 走看看