MVP
概况
- 发展史
- 最初Android的开发模式是MVC,这个模式可以延伸到上世纪70年代,但是这个结构的可维护性低,解耦性低,代码冗余,逻辑和控件的处理都在View层,其实就是一个类完成一个功能
- 上世纪90年代,引入了MVP模式,也是现在大厂主要的开发模式,从MVC转变而来,意在弥补MVC的缺陷
- 2005年引入MVVM,将V进一步分离
-
MVP
MVP属于三层分层架构。意在将数据和View真正意义上的分离,以及对V层的解耦,简单理解为将逻辑分离。
移动端MVP最完美的形式,就是被颂扬的clean架构( The Clean Architecture),但是对于咱们现在的业务,以及我的能力,做不到绝对深入的解耦clean。
image.png
MVC实例
- view
public class LoginActivity ex Activity{
private Login login;
private EditText username;
private EditText password;
private Button loginBtn;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
username = findViewById(R.id.username);
password = findViewById(R.id.password);
loginBtn = findViewById(R.id.login_btn);
loginBtn.setOnClickListener(new OnClickListener{
private void onClick(View v){
// 获取用户名、密码
// 上传
// 返回结果
// 验证角色
// 缓存信息
...
}
});
}
}
MVP实例
- ILoginView接口
public interface ILoginView {
/**
* 从UI中获取用户输入的用户名
*
* @return
*/
String getUsername();
/**
* 从UI中获取用户输入的密码
*
* @return
*/
String getPassword();
/**
* 跳转页面
*
*/
void startMainView();
}
- ILoginPresenter接口
public interface ILoginPresenter {
/**
* 登录
*/
void login();
}
- ILoginModel接口
public interface IUserModel {
/**
* 登录
*
* @param username 用户名
* @param password 密码
* @param callback 回调
*/
void login(String username, String password, Callback callback);
}
- UserModel
public class UserModel implements IUserModel {
//单利
public static UserModel getInstance() {
}
@Override
public void login(final String username, final String password, final Callback callback) {
//网络处理
}
}
- LoginActivity
public class LoginActivity extends BaseActivity<LoginPresenter> implements ILoginView {
private EditText username;
private EditText password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
bindView();
}
private void bindView(){
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
findViewById(R.id.login).setOnClickListener(this);
}
@Override
public LoginPresenter onCreatePresenter() {
return new LoginPresenter();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.login:
getPresenter.login();
break;
}
}
@Override
public String getUsername() {
return username.getText().toString().trim();
}
@Override
public String getPassword() {
return password.getText().toString().trim();
}
public void startMainView(){
ARouter.getInstance().build("/main/view").navigation();
}
}
- LoginPresenter
public class LoginPresenter implements ILoginPresenter {
@Override
public void login() {
UserModel.getInstance().login(getView.getUsername(), getView.getPassword(), new Callback() {
@Override
public void onSuccess() {
getView.startMainView();
//当然正常情况这里还需要做其他的处理,验证角色、缓存信息、保存数据库等等
}
@Override
public void onFailure(String errorMsg) {
MessageUtils.getInstance().show(errorMsg);
}
});
}
}
网友评论