黑马程序员技术交流社区
标题: 【济南中心】MVP设计模式 [打印本页]
作者: 大山哥哥 时间: 2017-2-28 23:43
标题: 【济南中心】MVP设计模式
本帖最后由 大山哥哥 于 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);
}
}
作者: 白岛我种树 时间: 2017-3-1 09:53
感谢分享~
作者: ch01001 时间: 2017-5-26 23:43
gvuyuyigu
作者: yehai 时间: 2017-5-29 07:38
6666666666666666666666666666666
作者: 644186052 时间: 2017-11-14 22:10
kkkkkkkkkkkkkk
作者: a840920945 时间: 2017-11-16 16:07
写的很好,对我有很大帮助
作者: baby14 时间: 2018-11-19 07:51
多谢分享
作者: 这是我的地盘 时间: 2019-8-16 15:37
要用到的东西,水一帖再说
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |