MVP模式学习———登陆例子

MVP模式学习———登陆例子

Activity中存放 Presenter 的引用,Presenter 中存放 View 和 Model 的引用

  • View 层


    这里写图片描述
    1. 全部View接口的父类 View
public interface View{
    //需要在onCreate()方法中写的代码都在此方法中实现
    void initView();
    //获取上下文参数
    Context getContext();
    //提示Toast
    void showToast(String text);
}
  1. 创建登陆用的LoginView
public interface LoginView extends View {
    //获取输入框内的用户名和密码
    String getUsernameEtText();
    String getPasswordEtText();

    //跳转
    void skipToMainActivity();
    void skipToRegisterActivity();
    void skipToForgetPwdActivity();

}
  • Model 层


    这里写图片描述
    1. 全部model接口的父类 Model
public interface Model{}
  1. 创建 bean类 User.class 包含 username 、password 字段以及set、get方法。
  2. 创建登陆用的 LoginModel
public interface LoginModel extends Model{
    //创建user逻辑
    User buildUser(String username,String password);
    //登陆逻辑
    boolean doLogin(Context context,User user);
}
  1. 创建实现类 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();
}
  1. 创建抽象类 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();
        }
    }
}
  1. 创建实现类 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 部分


    这里写图片描述
    1. 创建所有 Activity 父抽象类 BaseActivity,持有 AbsPresenter 的引用

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 排版,有不足之处还请谅解。代码部分是借鉴了别人的代码,并加上了自己的理解。如果有问题,请大佬们指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值