MVP 设计模式理解,实战理解MVP

作者: 夏至 欢迎转载,也请保留这份申明,谢谢。

http://blog.csdn.net/u011418943/article/details/69840880

1、什么是MVP

MVP,全称 Model-View-Presenter。它是从 MVC中演变过来的,它的基本思想是相通的;在MVP中,View更加专注于处理数据的可视化以及用户交互让Model专注于数据的处理,而Presenter则,提供 View 与 Model 之间数据的纽带,用于交互与数据传输;如下面这张图:
这里写图片描述

可以看到,在View 与 Model 之间我们是通过 Presenter,也就是 interface 来实现view 与数据的交互的,大大降低耦合,方便进行单元测试。至于与 MVC 的异同,自行google吧,这里就不细说了。

其实,自己在写代码的时候,心中有个概念就好了,view 就是UI,model就是数据处理,而persenter 则是他们的纽带。心中有个轮廓,写起来就不那么费劲了。

2、使用 MVP 的 优缺点

我们在使用一种设计模式的时候,首先都会问,为什么要用这种模式,能给我们带来哪些方便?用了这种模式,它的缺点会不会给我的工程造成影响?
首先,优点上,我们上面已经阐述了;

  • 减低耦合,实现了 Model 与View 的真正分离,修改 View 而不影响 Model
  • 模块职责分明,层次分明,便于维护,多人开发首选。
  • Presenter 可以服用,一个 Presenter可以用于多个 View,不用去改 Presenter
  • 利于单元测试。模块分明,那么我们编写单元测试就变得很方便了,而不用特别是特别搭平台,人工模拟用户操作等等耗时耗力的事情。

缺点:
对于小工程,额外多出来的代码量,和额外的代码复杂度,毕竟那么多 interface ,但对于它的有点来说,完全可以接受。

3、实战

我们就简单一个数据保存的例子好了。至于数据库的保存,采用郭霖大神的 LitePal,连接如下:
http://blog.csdn.net/column/details/android-database-pro.html
先上效果:
这里写图片描述

非常简单,就是获取 EditText的数据,保存在数据库,然后重新把它读取出来,结构图如下:
这里写图片描述

首先,从上面的效果图来看,我们需要 name 和 password 这两个字符串,我们需要新建一个 User 类,由于要用到 LitePal ,所以让它继承 DataSupport;如果你使用自己写的,那就不用继承啥了。:

public class User extends DataSupport{
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

Model:

然后,我们思考一下,从View 传过来的数据name和password,我们是要保存起来的,所以,我们先在 model,编写数据保存和读取的方法:

public interface IUserModel {
    void saveUserData(User user);
    User readUserData(String name);
}

它的具体实现方法如下:

/**
 * Created by zhengshaorui on 2017/4/9.
 */
public class UserModel implements IUserModel {
    public UserModel() {
    }
    /**
     * 使用Litepal保存数据
     * @return
     */
    @Override
    public void saveUserData(User user) {
        user.save();
        lg.d("user: "+user);
    }
    /**
     * 通过 name从数据库读取数据
     * @param name
     * @return
     */
    @Override
    public User readUserData(String name) {
        List<User> userList = DataSupport.where("username = ?",name).find(User.class);
        if (userList.size() > 0)
            return userList.get(0);
        return null;
    }
}

方法很简单,就保存一下数据和读数据。什么?数据库保存这样就行了?是的,所以赶紧去学习 LitePal 吧。

View:

View这里,我们是专注于UI的显示和用户交互的,上面我们通过名字的方式从数据库中读取,然后把它显示出来。所以,我们需要添加 name 和password 的显示方法,当然还有出错的方法:

public interface IUserView {
    void setUserName(String userName);
    void setPassword(String password);
    void error(String errormsg);
}

然后让mainactivity 继承这个接口重写该方法:

 @Override
    public void setUserName(String userName) {
        mUserEditText.setText(userName);
    }
    @Override
    public void setPassword(String password) {
        mPassEditText.setText(password);
    }
    @Override
    public void error(String errormsg) {
        Toast.makeText(this, errormsg, Toast.LENGTH_SHORT).show();
    }

Presenter :

好了,现在我们的 View 和 Model 都是单独开了的,所以,我们需要一个纽带,把view 和model 连接起来;那就是我们的 Presenter 了:

/**
 * Created by zhengshaorui on 2017/4/9.
 */
public class UserPresenter {
    private IUserView mIUserView;
    private IUserModel mIUserModel;
    public UserPresenter(IUserView mIUserView) {
        this.mIUserView = mIUserView;
        mIUserModel = new UserModel();
    }
    /**
     * 数据保存
     * @param user
     */
    public void saveUser(User user){
        mIUserModel.saveUserData(user);
    }
    /**
     * 读取数据
     * @param name
     */
    public void readUser(String name){
        User user =  mIUserModel.readUserData(name);
        lg.d("getread: "+user);
        if (user != null) {
            mIUserView.setUserName(user.getUsername());
            mIUserView.setPassword(user.getPassword());
        }else{
            mIUserView.error("没有找到");
        }
    }
}

ok,其他都写好了,那么接下来,只要写onclick事件就可以了:

//保存
    public void save(View view){
        User user = new User();
        user.setUsername(mUserEditText.getText().toString());
        user.setPassword(mPassEditText.getText().toString());
        mUserPresenter.saveUser(user);
    }
    //清空 edittext 
    public void clear(View view){
        mUserEditText.setText("");
        mPassEditText.setText("");
    }
    //读数据
    public void read(View view){
        mUserPresenter.readUser(mReadEditText.getText().toString());
    }

这样,我们就实现了一个简单的 MVP demo了。

疑问:

  1. 这样,你可能会有疑问?一个简单的demo被你写得这么复杂,还说这个设计模式有多好?
  2. 这么简单的,接口都那么多,那稍微复杂点的,那接口不是直接上天和太阳肩并肩了吗?

可能很多人有这样的疑问,是的,在一些小工程,或者一个项目只有一两个人开发的时候,你可以酌情考虑要不要使用这种模式,而使用这种模式,就考验你对接口的理解和使用了。
而稍微复杂点的,和多人开发的,我建议是使用这种模式的,当然没有完美的框架,适合自己的才是最重要的,反正我用的挺嗨的,有点搞逼格的感觉,笔者就试过一个稍微复杂的项目,多人开发,最后搞得很混乱,牵一发而动全一身;

当然也是见仁见智,最后附上demo的下载地址:https://github.com/LillteZheng/MvpDemo

参考:http://www.jianshu.com/p/9a6845b26856#

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
AspNetForums 的汉化版和改写版,主要改写在于: 1、修改了邮件发送程序,设计了可发送需要身份验证的邮件发送组件。 2、设计一个统一用户群组件(OneUsers.dll),只要你使用 OneUsers 的用户群(数据库可以使用我们的也可以使用你们自己的,我们提供 OneUsers 的数据库的 SQL 脚本),用户只要在加入本站用户群的任何一个论坛注册一次,就可以在其他论坛以同样的帐号登陆。 比如,你在 www.chinamvp.org 注册一次,那么你也可以用此帐号在 www.onebbs.net 登陆,而无需再次注册。 安装文档 1、必须安装MS SQL SERVER 2、必须安装.Net Framework + IIS 1、安装 MS SQL SERVER 论坛数据库文件 首先在 查询分析器里执行 aspnetforums_oneuser1.0.sql脚本安装论坛数据库 然后是 CreateDefaultData1.0.sql 安装默认数据 oneuser1.0.sql 是我们统一使用的用户群库,你可以不安装,而是使用我们的默认数据库,这个默认数据库在我们的服务器上。 如果你是英文系统 请执行 aspnetforums_oneuser1.0forEnSqlServer.sql 和 oneuser1.0forEnSqlServer.sql 但是不能保证论坛 能够正常执行 2、设置 AspNetForums 里的web.config <add key="connectionString" value="server=localhost; User ID=sa; Password=;database=aspnetforums" /> aspnetforums数据库 用户名和密码 <add key="connectionString" value="server=localhost; User ID=sa;database=OneUser" /> oneuser数据库 用户名和密码,你可以删除他或者注释掉,那么就是默认使用我们服务器上的统一用户库 3、设置邮件服务器 <add key="smtpServer" value="yourhost.com" /> <!-- Can specify SMTP Server to use to send out emails. Use "default" to use the default Windows 2000 SMTP Server --> <add key="ChinaASPXMailer" value="True" /> <!-- 如果你使用我们定制的邮件发送组件,请设为 True --> <add key="UserName" value="test@yourhost.com" /> <!--ChinaASPXMailer s UserName ,For Auth mail server --> <add key="Password" value="test" /> <!--ChinaASPXMailer s Password ,For Auth mail server --> <add key="Port" value="25" /> <!-- Port for ChinaASPXMailer s prot --> <add key="FromName" value="ChinaMVP.COM" /> <!-- FromName for ChinaASPXMailer s FromName --> <!--add key="Charset" value="GB2312" /--> <!-- FromName for ChinaASPXMailer s FromName ,Default value is gb2312 --> 把以上的 yourhost.com 改成你的邮件服务器 如果需要验证,请设置 UserName,否则 删除或者注释掉 4 、设置IIS,在你的web站点里设置一个虚拟目录 其物理目录指向 AspNetForums 目录。 5、解决方案 EngineAspNetForums.sln 6、管理员帐号: user:admin pwd:admin

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值