Android MVP(Model View Presenter)

本文介绍了在Android开发中,从MVC模式转向MVP模式的重构经验。详细阐述了MVP的三层结构:Model、View和Presenter,强调Presenter作为关键层的作用。同时,对比了MVP与MVC的区别,指出MVP能更好地实现关注点分离,提高可测试性和团队协作效率。文章还提供了两种不同的MVP实现方式,一种简化版,另一种更符合MVP理念,推荐后者。并附上了示例项目的GitHub链接。
摘要由CSDN通过智能技术生成

背景

前一段时间对公司项目进行了重构,在架构上面由原来的MVC模式切换到现在使用的MVP模式,经历了一段时间线上的的维护和升级决定写一些关于MVP模式的思考和反思。本文主要讲一些对MVP模式的介绍、和MVC模式的对比、以及怎么使用MVP模式来构建应用,最后给出一些意见。

一、关于mvp模式的一些介绍

MVP模式主要是对关注点进行分离,在MVP中将应用程序划分为三层。
* Model 持有应用的业务逻辑.它控制数据的创建 存储和修改
* View 显示用户数据界面,并将用户的交互事件给Presenter处理
* Presenter 从Model接收数据在View上显示,并处理View的交互事件
在这三层中主要的是Presenter层,它将所有层连接在一起。

二、MVC跟MVP之间的区别

其实MVC跟MVP是很像的唯一的不同的是Presenter跟Controller,在MVC模式中三个层是可以互相交流的View层可以直接从Model中取数据显示,但是在MVP中View只跟Presenter层进行交互。

其实很多人都不明白这样分层的用意,这样分层完全的将关注点进行了分离,提高了程序的可测试性,在写单元测试的时候会很方便和更清晰。从另外一个方面 可以提高工作的协调性,如果是一个大项目的话,可以一些工作人员专注于页面的编写,提供一些接口给编写业务的同事,大大的解耦了工作的耦合性。

三、MVP的一些实现

在MVP的实现上国内有很多的示例,这些示例不尽相同,我们这次重构使用的MVP其实是进行了很多的简化,当然这也是调研了很久的国内用的比较多的实现方式。以登录为案例,我们主要有四个文件(LoginActivity,ILoginView,LoginPresenter,LoginModel)。具体如下:
LoginActivity

public class LoginActivity extends Activity implements ILoginView {
oncreate(){
presenter=new LoginPresenter();
presenter.setView(this);
}
onDestory(){
presenter.setView(null);
presenter=null;
}
}

ILoginView

interface ILoginView{
void loginSuccessful();
void loginFail();
}

LoginPresenter

public class LoginPresenter{
ILogin view;
doLogin(String username,String psd){
// to server do login
//result successful
view.loginSuccessful();
}
}

上面的代码我写的很随意,其实大家可以看到 在上面基本上没有用的Model层,在实际用的过程中Model我们只用来当成一个数据对象来用,并没有像在介绍中的Model中处理逻辑,而是把所有的逻辑都放在了Presenter层。这种做法在一些简单的页面会显的很简洁,所以用的人不少。
之前看过国外一个MVP的示例感觉不错,可以值得参考:
在这个示例中是一个记事本APP,简单的业务逻辑就是可以添加和删除事项。
在这里主要是依靠一个接口将所有层连接起来,接口逻辑如下:

首先创建这个接口MVP_Main

public interface MVP_Main {
   
    /**
     * Required View methods available to Presenter.
     * A passive layer, responsible to show data
     * and receive user interactions
     */
    interface RequiredViewOps {
        // View operations permitted to Presenter
        Context getAppContext();
            Context getActivityContext();
        void notifyItemInserted(int layoutPosition);
            void notifyItemRangeChanged(int positionStart, int itemCount);
    }

    /**
     * Operations offered to View to communicate with Presenter.
     * Processes user interactions, sends data requests to Model, etc.
     */
    interface ProvidedPresenterOps {
        // Presenter operations permitted to View
        void clickNewNote(EditText editText);
            // setting up recycler adapter
            int getNotesCount();
            NotesViewHolder createViewHolder(ViewGroup parent, int viewType);
            void bindViewHolder(NotesViewHolder holder, int position);
    }

    /**
     * Required Presenter methods available to Model.
     */
    interface RequiredPresenterOps {
        // Presenter operations permitted to Model
        Context getAppContext();
            Context getActivityContext();
    }

    /**
     * Operations offered to Model to communicate with Presenter
     * Handles all data business logic.
     */
    interface ProvidedModelOps {
            // Model operations permitted to Presenter
            int getNotesCount();
            Note getNote(int position);
        int insertNote(Note
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值