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

来源:互联网 发布:矩阵分解含义 编辑:程序博客网 时间:2024/05/18 02:44

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 0