您的位置:首页 > 移动开发 > Android开发

Android中MVP模式的简单实现

2016-09-03 14:56 375 查看
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();
}
}


结束,希望对大家有帮助
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: