A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大山哥哥 黑马粉丝团   /  2017-2-28 23:43  /  1993 人查看  /  7 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 大山哥哥 于 2017-2-28 23:43 编辑

MVP(Model-View-Presenter) 主要目的都是划分模块职责,降低模块耦合,易测试,提高代码复用,这里主要针对Android平台来简单分析MVP.

1.层级责任
Model:       负责数据的检索,持久化等操作
View:         负责UI的绘制和用户的交互
Presenter: 作为Model和View的中间协调部分,负责两者之间的业务逻辑处理

2.MVP的优缺点
优点:降低耦合,层级职责更明显,易于单元测试
缺点:造成类数量爆炸,代码复杂度和学习成本高,在某些场景下presenter的复用会产生接口冗余

3.MVP简单的demo,登录逻辑用mvp进行编码

3.1项目结构
3.2 model层用来进行登录逻辑判断
LoginModel接口
[AppleScript] 纯文本查看 复制代码
public interface LoginModel {
    public void login(String userName,String psw);
}

LoginModelImpl用来实例化接口,并通知presenter登录结果
[AppleScript] 纯文本查看 复制代码
public class LoginModelImpl implements LoginModel {
    private LoginPresenter mLoginPresenter;

    public LoginModelImpl(LoginPresenter mLoginPresenter) {
        this.mLoginPresenter = mLoginPresenter;
    }

    @Override
    public void login(String userName, String psw) {
        //将用户名,密码发送的服务器
        MyLogger.d("userName "+userName+" psw "+psw);
        //将返回结果返回给presenter,这里假设登录成功
        mLoginPresenter.loginStatus(true);


    }
}

3.3.View层

把View层针对控件操作抽象出来一些列的接口
[AppleScript] 纯文本查看 复制代码
public interface LoginView {
    public void showLoginStatus(boolean status);
}

在Activity里面实现该接口的控件操作,并且初始化Presenter,这时可以看到Activity里面没有逻辑处理,只是对UI的控件进行数据或者行为的操作,所有的动作都是有Presenter的接口来实现,这样在项目里面会极大得精简Activity的体积.
[AppleScript] 纯文本查看 复制代码
public class LoginActivity extends AppCompatActivity implements LoginView {
    private LoginPresenter mLoginPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mLoginPresenter = new LoginPresenterImpl(this);
        final EditText userName = (EditText) findViewById(R.id.et1);
        final EditText password = (EditText) findViewById(R.id.et2);
        Button login = (Button) findViewById(R.id.button);
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MyLogger.d("onClick");
                mLoginPresenter.login(userName.getText().toString(), password.getText().toString());
            }
        });

    }

    @Override
    public void showLoginStatus(boolean status) {
        MyLogger.d("status=" + status);
        Toast.makeText(this, "status " + status, Toast.LENGTH_SHORT).show();
    }
}

3.4.Presenter层

在Presenter层里面,Presenter掌握着View和Model的所有接口,Presenter就可以根据不同的业务逻辑通过MV两层的接口来实现特定的功能,让M和V独立出来.
[mw_shl_code=applescript,true]public class LoginPresenterImpl implements LoginPresenter {
    private LoginView mLoginView;
    private LoginModel mLoginModel;

    public LoginPresenterImpl(LoginView mLoginView) {
        this.mLoginView = mLoginView;
        mLoginModel = new LoginModelImpl(this);
    }


    @Override
    public void login(String userName, String psw) {
        MyLogger.d("userName " + userName + " psw " + psw);
        mLoginModel.login(userName, psw);
    }


    @Override
    public void loginStatus(boolean status) {
        MyLogger.d("status " + status);
        mLoginView.showLoginStatus(status);
    }
}

游客,如果您要查看本帖隐藏内容请回复



7 个回复

倒序浏览

回帖奖励 +2

感谢分享~
回复 使用道具 举报
gvuyuyigu
回复 使用道具 举报
6666666666666666666666666666666
回复 使用道具 举报
kkkkkkkkkkkkkk
回复 使用道具 举报
a840920945 来自手机 初级黑马 2017-11-16 16:07:18
地板
写的很好,对我有很大帮助
回复 使用道具 举报
baby14 金牌黑马 2018-11-19 07:51:05
7#
多谢分享
回复 使用道具 举报
要用到的东西,水一帖再说
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马