MVP是怎么来的
讲到MVP首先跟大家讲讲MVC,记得有一次在面试的,公司的一个技术总监问了我一个问题:安卓是如何体现MVC的.我当初回答也是OK,但那个技术总监也是面试完了给了我一个准确答案,应该这么说,首先把MVC的几个层次说一下,
1: Modle:数据模型和业务逻辑
2: View:XML(布局文件)
3: Controller: Activity,Fragment
其中View层和Controller层耦合了,可以说View层是Activity,Fragment这种说法也没错.
有位国外的大牛说过一句话,大多数的Android app用的是仅仅是View_Model框架,也就是少了Controller.
正式因为MVC耦合的原因,所以有了MVP
介绍MVP
* Model: 数据模型和业务逻辑
* View: Acitvity,Fragment
* Presenter: 起来桥梁的作用
Presenter 打个比方 presenter好比一个经济人,Moldel好比一个明星,View 比作一个广告商,广告商要找明星代言广告,明星没有空去处理这个事情但是广告商可以通过联系明星的经济人,然后经济人又跟明星说,代言广告有很多钱赚哦,还没什么坏影响,明星一听,有好多钱赚,接了然后二者就达成交易.
好了现在开始代码一步一步展示出来,先看看登录界面
第一步: Model层 数据模型和业务逻辑
简单,只有一个登录的逻辑
1.1: 登录模型
public interface IUserLoginMolder {
/**
* Model:登录模型
*/
void userLogin(String userName ,String passworld,OnUserLoginListener listener);
}
OnUserLoginListener 是一个接口,就是登录有成功或者失败
/*
* 用户登录回调接口
*/
public interface OnUserLoginListener {
/**
* 登录成功调用
*/
void loginSuccess(User user);
/**
* 登录失败调用
*/
void loginError();
}
1.2: 业务逻辑
/**
* Model层,用户登录
*/
public class UserLogin implements IUserLoginMolder {
@Override
public void userLogin(String userName, String passworld, OnUserLoginListener listener) {
User user = new User(userName,passworld);
//登录业务逻辑
if ("text".equals(userName) && "text".equals(passworld)) {//登录成功
listener.loginSuccess(user);
} else {//登录失败
listener.loginError();
}
}
}
/*
* @描述: 用户的Bean类
*/
public class User {
private String userName;
private String passworld;
public User(String userName, String passworld) {
this.userName = userName;
this.passworld = passworld;
}
public String getPassworld() {
return passworld;
}
public void setPassworld(String passworld) {
this.passworld = passworld;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
第二步:View层
/**
* View层,如何实现View层,View层是最复杂的一层
* 1.有什么操作:获取用户名、获取密码
* 2.有什么用户交互:显示滚动条、隐藏滚动条
* 3.有什么结果:登录成功跳转主页、登录失败提示用户
*/
public interface IUserLoginView {
/**获取用户名*/
String getUsername();
/**获取密码*/
String getPassword();
/**显示滚动条*/
void showProgressbar();
/**隐藏滚动条*/
void hideProgressbar();
/**登录成功跳转主页*/
void jump2Main(User user);
/**登录失败提示用户*/
void showLoginError();
}
第三步:Presenter层
/**
* Presenter层
* 1.p层既然起到桥梁的作用,p层必须持有model和view层对象(成员变量)
* 2.既然起到桥梁的左右,所以需要提供桥梁方法,当前的业务逻辑是登录,所以桥梁方法也是为了登录服务
*/
public class UserLoginPresenter implements OnUserLoginListener {
UserLoginView mUserLoginView;
UserLogin mUserLogin;
public UserLoginPresenter(UserLoginView view){
//由于Model和View层没有联系,所以创建对象时只能传一个即View层也就是明星层
mUserLogin = new UserLogin();
mUserLoginView = view;
}
public void login(){
//登录一进来就展示加载条
mUserLoginView.showDialog();
//开始登录
mUserLogin.userLogin(mUserLoginView.getUserName(),mUserLoginView.getPassword(),this);
}
/**
* 登录成功
* @param user
*/
@Override
public void loginSuccess(User user) {
//隐藏加载条
mUserLoginView.hidDialog();
//跳转页面
mUserLoginView.jump2MainActivity();
}
/**
* 登录失败
*/
@Override
public void loginError() {
//隐藏加载条
mUserLoginView.hidDialog();
//弹一个登录失败的Toast
mUserLoginView.loginError();
}
}
结束了三个层全部完成,最后附上MainActivity代码
public class MainActivity extends AppCompatActivity implements UserLoginView {
private EditText etUsername;
private EditText etPassword;
private ProgressBar progressBar;
private Context context;
private Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity_mvp);
etUsername = (EditText) findViewById(R.id.et_username);
etPassword = (EditText) findViewById(R.id.et_password);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
btnLogin= (Button) findViewById(R.id.btnLogin);
context=this;
//创建一个中间层
final UserLoginPresenter presenter = new UserLoginPresenter(this);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开始登录
presenter.login();
}
});
}
@Override
public String getUserName() {
if (TextUtils.isEmpty(etUsername.getText().toString().trim())) {
return "";
}
return etUsername.getText().toString().trim();
}
@Override
public String getPassword() {
if (TextUtils.isEmpty(etPassword.getText().toString().trim())) {
return "";
}
return etPassword.getText().toString().trim();
}
@Override
public void showDialog() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void hidDialog() {
progressBar.setVisibility(View.GONE);
}
@Override
public void jump2MainActivity() {
showToast("跳转到另一个页面");
}
@Override
public void loginError() {
showToast("账号或者密码错误");
}
public void showToast(String msg){
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
}
结束,希望对大家有帮助