Android中的mvp模式

本文深入探讨MVP(Model-View-Presenter)设计模式,详细解释其在GUI应用程序中的作用,对比MVC,通过实例展示MVP如何实现View与Model的解耦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MVP简介

MVP(Model-View-Presenter) 是针对有GUI存在的应用程序,比如像安卓,苹果以及PC的客户端软件中用以划分组织代码的一种设计模式,是由MVC模式升级演进出来的,目的在于,对于GUI层来说,把UI展示与逻辑分开。

MVP(Model-View-Presenter)模式
Model:主要负责数据的存取功能。Presenter需要通过Model层来存储、获取数据。
View:负责处理用户事件和视图部分的展示。在Android中,它可能是Activity、fragment类或者是某个View控件。
Presenter:作为View和Model之间沟通的桥梁,它从Model层检索数据后返回给View层,使得View和Model之间没有耦合。

在MVP里,Presenter完全将Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时可以保持Presenter的不变,这点符合面向接口编程的特点。View不应该有简单的Set/Get方法,以及用户输入和设置界面显示的内容。除此之外就不应该有更多的内容。绝不允许View直接访问Model,这就是MVP与MVC的很大不同之处。

MVP与MVC的对比

MVP项目演示

案例展示

一个登陆的小demo来展示MVP的使用

model层描述和具体代码

提供我们想要展示在view层的数据和具体登陆业务逻辑处理的实现,具体代码实现如下:

/**
 * 登录接口
 */
public interface IUser {
    void login(String username,String password,LoginListener listener);
    interface  LoginListener{
        void success(User user);
        void failed();
    }
}
/**
 * 登录接口的实现类
 */
public class UserBiz implements IUser {
    @Override
    public void login(final String username, final String password, final LoginListener listener) {
        //开启子线程模拟登录
        new Thread(){
            @Override
            public void run() {
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                 if ("admin".equals(username)&&"123456".equals(password)){
                       User user=new User();
                       user.setUsername(username);
                       user.setPassword(password);
                       listener.success(user);
                 }else{
                     listener.failed();
                 }
            }
        }.start();
    }
}

view层描述和具体代码

定义了与界面交互的方法,MVP下Activity和Fragment以及View的子类体现在了这一 层,Activity一般也就做加载UI视图、设置监听再交由Presenter处理的一些工作,所以也就需要持有相应Presenter的引用。本层所需要做的操作就是在每一次有相应交互的时候,调用presenter的相关方法就行。具体实现代码如下:

/**
 * 登陆View的接口,实现类也就是登陆的activity
 */
public interface LoginView {
    //获取用户名和密码
    String getUsername();
    String  getPassword();
    //登录成功与失败
    void toMainActivity(User user);
    void showFailedError();
    //给用户的提示
    void showLoading();
    void hideLoading();
}

presenter层描述和具体代码

presenter是一个中间人的角色,通过model层来获得和保存数据,然后通过view更新界面,这期间通过定义接口使得view和model没有任何交互。具体实现代码如下:

/**
 *主要是Model层和View层的交互和操作
 */
public class LoginPresenter {
    private LoginView loginView;
    private UserBiz userBiz;
    private Handler mHandler=new Handler() ;

    public LoginPresenter(LoginView loginView) {
        this.loginView = loginView;
        userBiz=new UserBiz();
    }

    public void login() {
        loginView.showLoading();
        userBiz.login(loginView.getUsername(), loginView.getPassword(), new IUser.LoginListener() {
            @Override
            public void success(final User user) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        loginView.toMainActivity(user);
                        loginView.hideLoading();
                    }
                });
            }
            @Override
            public void failed() {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        loginView.showFailedError();
                        loginView.hideLoading();
                    }
                });
            }
        });
    }
}

补充

参考资料

这是一个mvp的参考资料https://github.com/antoniolg/androidmvp,大家可以下载下来学习一下。

项目地址

优快云:https://download.youkuaiyun.com/download/wen_haha/10720667

Github:https://github.com/kongkongdaren/MVPDemoTwo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值