android 開發(fā)之初學(xué)MVP設(shè)計(jì)模式(模擬登錄)
以模擬登錄為例迎献,學(xué)習(xí)MVP模式
一、新建工程腻贰,創(chuàng)建MVP目錄結(jié)構(gòu)
Paste_Image.png
1忿晕、activity 主要放activity界面
2、Model M層 主要放基本實(shí)體類银受、接口和接口實(shí)現(xiàn)類
3践盼、View V層 view與presenter交互的接口,讓Activity實(shí)現(xiàn)
4宾巍、Presenter P層 Model與view的控制器咕幻,持有view和model的引用,從view中獲取參數(shù)顶霞,交給model去處理肄程,執(zhí)行結(jié)果通過接口的方式通過presenter層傳遞給view層進(jìn)行顯示。
二选浑、在veiw層中創(chuàng)建LoginView 接口蓝厌,獲取activity中需要的參數(shù)
Paste_Image.png
在Activity中實(shí)現(xiàn)該接口,將參數(shù)暴露給loginview
Paste_Image.png
三古徒、在model層創(chuàng)建OnLoginListener接口 拓提,用來監(jiān)聽處理model實(shí)現(xiàn)后的操作;
Paste_Image.png
在presenter層創(chuàng)建LoginPresenter類實(shí)現(xiàn)OnLoginListener接口隧膘,用來處理model的View
/**
* Created by zzj on 2017/1/6.
*/
public class LoginPresenter implements OnLoginListener {
@Override
public void onUsernameError() {
}
@Override
public void onPasswordError() {
}
@Override
public void onSuccess() {
}
@Override
public void onFailure() {
}
}
四代态、在model層創(chuàng)建登錄接口(LoginPort),獲取需要的參數(shù)
/**
* 登錄接口
* Created by zzj on 2017/1/6.
*/
public interface LoginPort {
void login(String username,String password,OnLoginListener onLoginListener);
}
在model層中創(chuàng)建loginModelImple類實(shí)現(xiàn)LoginPort接口疹吃,此類主要是處理網(wǎng)絡(luò)請求的操作蹦疑。由于本次未使用到網(wǎng)絡(luò)請求,簡單實(shí)現(xiàn)本地模擬登錄萨驶。
/** 處理網(wǎng)絡(luò)請求的操作
* Created by zzj on 2017/1/6.
*/
public class LoginModelImple implements LoginPort {
@Override
public void login(String username, String password, OnLoginListener onLoginListener) {
if(username.equals("admin")&&password.equals("123456")){
onLoginListener.onSuccess();//登錄成功
}else if(!username.equals("admian")||!password.equals("123456")){
onLoginListener.onUsernameError();//用戶名或者密碼錯誤
}else {
onLoginListener.onFailure();//登錄失敗
}
}
}
五歉摧、在LoginPresenter類中,聲明實(shí)例化登錄接口(LoginPort)和登錄View(LoginView),將從view層獲取的用戶名和密碼傳送給model層叁温,然后讓activity中的登錄按鈕調(diào)用
/**
* Created by zzj on 2017/1/6.
*/
public class LoginPresenter implements OnLoginListener {
private LoginPort loginPort;//登錄接口
private LoginView loginView;//登錄veiw
//實(shí)例化登錄接口和登錄view
public LoginPresenter(LoginView loginView){
this.loginView = loginView;
loginPort = new LoginModelImple();
}
/**
* 將從view層中獲取的用戶名和密碼傳送給Model層
* 然后讓activity中的登錄按鈕調(diào)用此方法
*/
public void login(){
String username = loginView.getUsername();
String password = loginView.getPassword();
loginPort.login(username,password,this);
}
@Override
public void onUsernameError() {
loginView.showToast("用戶名或者密碼錯誤");
}
@Override
public void onSuccess() {
loginView.showToast("登錄成功豆挽!");
}
@Override
public void onFailure() {
loginView.showToast("異常錯誤!");
}
}
在loginAcitivy中實(shí)例化LoginPresenter類券盅,調(diào)用login方法帮哈。
public class LoginActivity extends AppCompatActivity implements View.OnClickListener,LoginView {
private AppCompatEditText username ,password;
private AppCompatButton loginBt;
private LoginPresenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
loginPresenter = new LoginPresenter(this);
}
private void initView(){
username = (AppCompatEditText) findViewById(R.id.login_username);
password = (AppCompatEditText) findViewById(R.id.login_password);
loginBt = (AppCompatButton) findViewById(R.id.login_loginbt);
loginBt.setOnClickListener(this);
}
/**
* 向view層暴露參數(shù)
* @return 用戶名
*/
public String getUsername(){
return username.getText().toString().trim();
}
public String getPassword(){
return password.getText().toString().trim();
}
@Override
public void showToast(String msg) {
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
@Override
public void onClick(View v) {
loginPresenter.login();
}
}
效果展示:
Screenshot_1483695444.png
Screenshot_1483695452.png