码农翻身

MVP模式架构初识且简单实现

- by MRyan, 2020-03-22


1.概念

相对于MVC模式架构大家都已经听得够多了,那么MVP模式又是什么呢?
和MVC一样 MVP三个字母就代表三个东西
M:Model-模型:主要是实体模型,数据的存取与业务逻辑,主要负责数据的加载
V:View-视图:对应Activity(或Fragment),主要负责View的绘制以及用户交互。
P: Presenter: 负责View与Model间交互,可以理解为媒介,就像媒婆那样的功能。

2.优点

利用MVP架构的项目优点明显

  1. 降低耦合度,隐藏数据,使Activity(或Fragment)中代码更加简洁,只负责处理View的职责;
  2. 模块职责分工明确;
  3. 方便测试开发;
  4. 代码复用性较高。

3.实现

现在对于Andorid开发的MVP设计模式还没有一个统一的标准,基于MVP思想可以有很多的实现方式,而谷歌推荐的MVP实现方式中,弱化了Model的作用,将Model融入到Presenter中,定义Contract契约类作为View和Presenter的接口,定义View和Presenter需要实现的方法,View和Presenter各自实现,做到了降低耦合度使代码工整。

我们举一个具体的例子
我们点击界面中的按钮,在上方显示数据(就是一个简单的功能)
在这里插入图片描述

贴上项目结构
在这里插入图片描述

Constract

    /**
     * @description:TODO
     * @Author MRyan
     * @Date 2020/3/2 13:50
     * @Version 1.0
     */
    public interface MainConstract {
        interface MainView {
            void onShowData(String msg);
        }
    
        interface MainPresenter {
            void ShowData();
  
        }
    }

上文说了Constract是一个契约接口类,里面另一个View和Presenter要实现的方法,将View和Presenter联系到一起

Presenter

    /**
     * @description:TODO
     * @Author MRyan
     * @Date 2020/3/2 13:51
     * @Version 1.0
     */
    public class MainPresenter implements MainConstract.MainPresenter {
        private MainConstract.MainView mainView;
    
        public MainPresenter(MainConstract.MainView view) {
            this.mainView = view;
        }
    
    
        @Override
        public void ShowData() {
            String msg = "这是测试";
            mainView.onShowData(msg);
        }
    }

上文我们说了,Presenter是View和Model交互的地方 这里我们实现了功能并回调给(View)Activity

View

    public class MainActivity extends AppCompatActivity implements MainConstract.MainView {
        private MainPresenter mainPresenter;
        private Button mShowBtn;
        private TextView mShowTev;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mShowBtn=findViewById(R.id.btn_main_show);
            mShowTev=findViewById(R.id.tev_main_show);
            mainPresenter=new MainPresenter(this);
            mShowBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mainPresenter.ShowData();
                }
            });
        }
    
    
        @Override
        public void onShowData(String msg) {
            mShowTev.setText(msg);
        }
    }

MainActivity实现了重写的onShowData()方法,在重写的方法中我们实现数据显示在TextView上

这就完成了简单的MVP模式架构
我们如果想要添加功能 很简单明了。
我们在Constract中定义需要实现的方法

    /**
     * @description:TODO
     * @Author MRyan
     * @Date 2020/3/2 13:50
     * @Version 1.0
     */
    public interface MainConstract {
        interface MainView {
            void onShowData(String msg);
            void onClearData();
        }
    
        interface MainPresenter {
            void ShowData();
            void ClearData();
    
        }
    }

在Persenter回调方法

    /**
     * @description:TODO
     * @Author MRyan
     * @Date 2020/3/2 13:51
     * @Version 1.0
     */
    public class MainPresenter implements MainConstract.MainPresenter {
        private MainConstract.MainView mainView;
    
        public MainPresenter(MainConstract.MainView view) {
            this.mainView = view;
        }
    
    
        @Override
        public void ShowData() {
            String msg = "这是测试";
            mainView.onShowData(msg);
        }
    
        @Override
        public void ClearData() {
            mainView.onClearData();
        }
    }

最后在Acitvity实现它

    public class MainActivity extends AppCompatActivity implements MainConstract.MainView {
        private MainPresenter mainPresenter;
        private Button mShowBtn;
        private TextView mShowTev;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mShowBtn=findViewById(R.id.btn_main_show);
            mShowTev=findViewById(R.id.tev_main_show);
            mainPresenter=new MainPresenter(this);
            mShowBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mainPresenter.ShowData();
                }
            });
            mShowBtn.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    mainPresenter.ClearData();
                    return true;//这里返回True
                }
            });
        }
    
    
        @Override
        public void onShowData(String msg) {
            mShowTev.setText(msg);
        }
    
        @Override
        public void onClearData() {
            mShowTev.setText("");
        }
    }

很简单吧,看看效果
在这里插入图片描述

也许你会问这么简单的功能用MVP模式实现这么复杂,那我要告诉你着确实很复杂,但是当你的项目十分庞大它的优势就出来了。

作者:MRyan


本文采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
转载时请注明本文出处及文章链接。本文链接:https://wormholestack.com/archives/632/
2025 © MRyan 39 ms