初识MVP
MVC:M-Model-模型、V-View-视图、C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型、V-View-视图、P-Presenter-表示器。 从MVC和MVP两者结合来看,Controlller/Presenter在MVC/MVP中都起着逻辑控制处理的角色,起着控制各业务流程的作用。而 MVP与MVC最不同的一点是M与V是不直接关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层,其负责调控 View与Model之间的间接交互,MVP的结构图如下所示,对于这个图理解即可而不必限于其中的条条框框,毕竟在不同的场景下多少会有些出入的。在 Android中很重要的一点就是对UI的操作基本上需要异步进行也就是在MainThread中才能操作UI,所以对View与Model的切断分离是 合理的。此外Presenter与View、Model的交互使用接口定义交互操作可以进一步达到松耦合也可以通过接口更加方便地进行单元测试。
View 对应于Activity,负责View的绘制以及与用户交互
Model 依然是业务逻辑和实体模型
Presenter 负责完成View于Model间的交互
MVP项目结构
MVP项目结构图M-Model-模型、V-View-视图、P-Presenter-表示器
首先,实体类User
public class User {
private String name;
private String pwd;
public User(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
IUserModel
public interface IUserModel {
void login(String name, String pwd, OnLoginListener listener);
}
OnLoginListener
public interface OnLoginListener {
void onSuccess(User user);
void onFailed();
}
UserModel
public class UserModel implements IUserModel {
@Override
public void login(String name, String pwd, OnLoginListener listener) {
if (TextUtils.isEmpty(name) || TextUtils.isEmpty(pwd)) {
return;
}
if ("wanghao".equals(name) && "123".equals(pwd)) {
listener.onSuccess(new User(name, pwd));
}else {
listener.onFailed();
}
}
}
UserLoginView
public interface UserLoginView {
String getUserName();
String getPwd();
void onSuccess(User user);
void onFailed();
void showLoading();
void hideLoading();
}
UserPresenter
public class UserPresenter {
private UserLoginView loginView;
private UserModel userModel;
private Handler handler=new Handler();
public UserPresenter(UserLoginView loginView) {
this.loginView = loginView;
userModel = new UserModel();
}
public void login() {
loginView.showLoading();
userModel.login(loginView.getUserName(), loginView.getPwd(), new OnLoginListener() {
@Override
public void onSuccess(final User user) {
//一般为为网络请求,需要开启子线程,不能直接更新UI
handler.post(new Runnable() {
@Override
public void run() {
loginView.onSuccess(user);
loginView.hideLoading();
}
});
}
@Override
public void onFailed() {
loginView.onFailed();
loginView.hideLoading();
}
});
}
}
MainActivity
public class MainActivity extends AppCompatActivity implements UserLoginView {
private EditText et_user;
private EditText et_pwd;
private Button bt_login;
private UserPresenter userPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
userPresenter = new UserPresenter(this);
initView();
}
private void initView() {
et_user = (EditText) findViewById(R.id.et_user);
et_pwd = (EditText) findViewById(R.id.et_pwd);
bt_login = (Button) findViewById(R.id.bt_login);
bt_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
userPresenter.login();
}
});
}
@Override
public String getUserName() {
return et_user.getText().toString();
}
@Override
public String getPwd() {
return et_pwd.getText().toString();
}
@Override
public void onSuccess(User user) {
Toast.makeText(this, "欢迎" + user.getName(), Toast.LENGTH_SHORT).show();
}
@Override
public void onFailed() {
Toast.makeText(this, "失败", Toast.LENGTH_SHORT).show();
}
@Override
public void showLoading() {
}
@Override
public void hideLoading() {
}
}
最后
个人理解,有什么不对的地方还请各位大神指正。
网友评论