MVP模式学习———登陆例子
Activity中存放 Presenter 的引用,Presenter 中存放 View 和 Model 的引用
View 层
- 全部View接口的父类
View
- 全部View接口的父类
public interface View{
//需要在onCreate()方法中写的代码都在此方法中实现
void initView();
//获取上下文参数
Context getContext();
//提示Toast
void showToast(String text);
}
- 创建登陆用的LoginView
public interface LoginView extends View {
//获取输入框内的用户名和密码
String getUsernameEtText();
String getPasswordEtText();
//跳转
void skipToMainActivity();
void skipToRegisterActivity();
void skipToForgetPwdActivity();
}
Model 层
- 全部model接口的父类
Model
- 全部model接口的父类
public interface Model{}
- 创建 bean类
User.class
包含 username 、password 字段以及set、get方法。 - 创建登陆用的
LoginModel
public interface LoginModel extends Model{
//创建user逻辑
User buildUser(String username,String password);
//登陆逻辑
boolean doLogin(Context context,User user);
}
- 创建实现类
LoginModelImpl
public class LoginModelImpl implements LoginModel{
//创建用户对象
User buildUser(String username,String password){
User user=new User();
user.setUsername(username);
user.setPassword(passwrod);
return user;
}
//登陆逻辑
boolean doLogin(Context context,User user){
String username=user.getUsername();
String password=user.getPassword();
if("123456".equals(username)&&"654321".equals(password)){
return true;
}
else{
reture false;
}
}
}
Presenter 层
1.创建接口类Presenter
public interface Presenter{
//在Activity和Fragment中调用的方法
void onCreate();
}
- 创建抽象类
AbsPresenter
,利用泛型,持有Model 和 View 层的引用
public abstract class AbsPresenter<V extends View,M extends Model> implements Presenter{
protected V mView;
protected M mModel;
//构造方法
public AbsPresenter(View mView){
this.mView=(V)mView;
}
@Override
public void onCreate(){
if(mView!=null){
mView.initView();
}
}
}
- 创建实现类
LoginPresenter
,继承自AbsPresenter
public class LoginPresenter extends AbsPresenter<LoginView,LoginModel>{
private LoginPresenter(View mView){
super(mView);
mModel=new LoginModelImpl();
}
public static LoginPresenter build(View mView){
return new LoginPresenter(mView);
}
/**
* 以下为Activity中要进行的方法
*/
public void skipToMainActivity(){
mView.skipToMainActivity();
}
public void skipToRegisterActivity(){
mView.skipToRegisterActivity();
}
public void skipToForgetPwdActiivty(){
mView.skipToForgetPwdActivity();
}
public void clickDoLogin(){
if(mView==null||mModel==null)
return;
String username=mView.getUsernameEtText();
String password=mView.getPasswordEtText();
if(!checkInput(username,password))
return;
User user=mModel.buildUser(username,password);
boolean result=mModel.doLogin(mView.getContext(),user);
if(result){
mView.showToast("登陆成功");
}else{
mView.showToast("登陆失败");
}
}
private boolean checkInput(String username,String password){
if(TextUtil.isEmpty(username)){
mView.showToast("用户名不能为空");
return false;
}else if(TextUtil.isEmpty(password)){
mView.showToast("密码不能为空");
return false;
}
return true;
}
}
Activity 部分
- 创建所有 Activity 父抽象类
BaseActivity
,持有 AbsPresenter 的引用
- 创建所有 Activity 父抽象类
pulic abstract class BaseActivity<P extends AbsPresenter> extends AppCompatActivity implements View.OnClickListener{
protected final String TAG=getClass().getName();
protected P mPresenter;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(getContentViewId());
mPresenter=buildPresenter();
if(mPresenter!=null){
mPresenter.onCreate();
}
}
//设置布局
protected abstract int getContentViewId();
//获取Presenter
protected abstract P buildPresenter();
@Override
public void onClick(View view){
widgetClick(view);
}
//控件的click都在此实现
public abstract void widgetClick(View view);
protected void toast(String text){
Toast.makeText(getApplicationContext(),text,Toast.LENGTH_SHORT).show();
}
}
2.创建 LoginActivity
public class LoginActivity extends BaseActivity<LoginPresenter> implements LoginView{
private EditText mUsernameEt;
private EditText mPasswordEt;
private Button mLoginBtn;
private Button mRegisterBtn;
private Button mForgetPwdBtn;
@Override
protected int getContentViewId(){
return R.layout.activity_login;
}
@Override
protected LoginPresenter buildPresenter(){
return LoginPresenter.build(this);
}
@Override
public void initView() {
mUsernameEt= (EditText) findViewById(R.id.username_et);
mPasswordEt= (EditText) findViewById(R.id.password_et);
mLoginBtn= (Button) findViewById(R.id.login_btn);
mRegisterBtn= (Button) findViewById(R.id.register_btn);
mForgetPwdBtn= (Button) findViewById(R.id.forgetPwd_btn);
mLoginBtn.setOnClickListener(this);
mRegisterBtn.setOnClickListener(this);
mForgetPwdBtn.setOnClickListener(this);
}
@Override
public void widgetClick(View view) {
switch(view.getId()){
case R.id.login_btn:
mPresenter.clickDoLogin();
break;
case R.id.register_btn:
mPresenter.skipToRegisterActivity();
break;
case R.id.forgetPwd_btn:
mPresenter.skipToForgetPwdActivity();
break;
}
}
@Override
public String getUsernameEtText() {
return mUsernameEt.getText().toString();
}
@Override
public String getPasswordEtText() {
return mPasswordEt.getText().toString();
}
@Override
public void skipToMainActivity() {}
@Override
public void skipToRegisterActivity() {}
@Override
public void skipToForgetPwdActivity() {}
@Override
public Context getContext() {
return getApplicationContext();
}
@Override
public void showToast(String text) {
toast(text);
}
}
第一次写博客,也是第一次用 markdown 排版,有不足之处还请谅解。代码部分是借鉴了别人的代码,并加上了自己的理解。如果有问题,请大佬们指正。