Android MVP架构模式
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
概述
MVP模式是Android常见的的一种架构模式全称是Model、View、Presenter。其中Model负责数据处理部分View负责UI界面展示及用户操作交互而Presenter则是负责大部分运行逻辑的编写。在Android中常见的MVC架构模式一般是直接在Activity中实现运行逻辑这样如果功能比较复杂Activity的代码可读性将会很低同时耦合性将会很高。与MVC模式相比MVP模式断开了Model与View的直接交互降低了代码的耦合性也提高了代码的可复用性。
实例
本文以登录注册功能的编写演示MVP架构的实现方式。登录注册UI界面的编写可以参考这篇文章Android开发登录/注册界面的编写在这里不再赘述。
Android中Activity一般充当View的角色在Activity中实现对用户输入的检测以及交互Presenter则负责将View传来的用户输入信息Username
、Password
等传给Model由Model进行具体的数据判断并将判断结果用户是否存在、密码是否正确等回传给PresenterPresenter在收到Model的回传后再调用View中的UI更新方法对界面进行更新具体实现如下
Model
我们编写一个LoginModelInterface
接口用于表征Model并新建一个LoginModel
类实现LoginModelInterface
接口。在LoginModelInterface
中增加一个isUserValid(String username, String password)
方法并在LoginModel
中对该方法进行实现
public class LoginModel implements LoginModelInterface {
@Override
public boolean isUserValid(String username, String password) {
// 在本方法中对用户输入的用户名及密码进行判断并返回登录结果
return false;
}
}
View
我们使用MainActivity
充当View的角色。同样的我们新建一个LoginViewInterface
接口在LoginViewInterface
接口中编写两个方法loginButtonClicked()
以及showLoginResult()
public interface LoginViewInterface {
void loginButtonClicked(String username, String password);
void showLoginResult(boolean result);
}
让MainActivity
实现该接口并实现上述两个方法
@Override
public void loginButtonClicked(String username, String password) {
mLoginPresenter.loginButtonClicked(username, password);
}
@Override
public void showLoginResult(boolean isValid) {
if(isValid) {
Toast.makeText(getApplicationContext(), "Login Success !", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "Login Failed !", Toast.LENGTH_LONG).show();
}
}
在loginButtonClicked()
方法中调用LoginPresenter
的对应方法进行具体处理而在showLoginResult()
中根据LoginPresenter
回传的结果设置具体的展示。为了方便演示我们通过Toast
的方式提示登录结果。
Presenter
同样的新建一个LoginPresenterInterface
接口用于表征Presenter并新建一个LoginPresenter
类实现上述接口重写该接口中的loginButtonClicked()
方法
@Override
public void loginButtonClicked(String username, String password) {
boolean isValid = mLoginModel.isUserValid(username, password);
mLoginView.showLoginResult(isValid);
}
在该方法中通过调用LoginModel
的isUserValid()
方法进行用户输入的合法性判断并调用LoginView
的showLoginResult()
方法对UI界面进行更新以此实现“中间人”的角色。
后记
- 为什么每个类都要编写一个对应的接口
为了提高代码的可复用性。以LoginView
为例在LoginPresenter
中为了实现对LoginView
中界面更新方法的调用在LoginPresenter
的构造方法中传入了LoginView
的引用。如果不定义一个LoginViewInterface
而是直接传入MainActivity
那么这个LoginPresenter
只能与MainActivity
一一对应而如果传入的参数设置为LoginViewInterfce
那么只要让其他的View
实现LoginViewInterface
这些View
就能使用LoginPresenter
提高了代码的可复用性。 - 目前只是初步实现了MVP架构对传入引用可能导致的内存泄漏没有过多的关注需要大家注意后续有时间的话笔者也会针对这一块进行补充和完善。
全部代码
Model
LoginModelInterface
public interface LoginModelInterface {
boolean isUserValid(String username, String password);
}
LoginModel
public class LoginModel implements LoginModelInterface {
@Override
public boolean isUserValid(String username, String password) {
// 在本方法中对用户输入的用户名及密码进行判断并返回登录结果
return false;
}
}
View
LoginViewInterface
public interface LoginViewInterface {
void loginButtonClicked(String username, String password);
void showLoginResult(boolean isValid);
}
MainActivity
public class MainActivity extends AppCompatActivity implements LoginViewInterface {
private Button mBtLogin;
private EditText mEtUsername, mEtPassword;
private LoginPresenterInterface mLoginPresenter;
String TAG = "LoginPage";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
// set click listener
mBtLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//gain the content of usename and password,for further use
String username = mEtUsername.getText().toString();
String password = mEtPassword.getText().toString();
//Tell Presenter that login button clicked
loginButtonClicked(username, password);
}
});
}
@Override
public void loginButtonClicked(String username, String password) {
mLoginPresenter.loginButtonClicked(username, password);
}
@Override
public void showLoginResult(boolean isValid) {
if(isValid) {
Toast.makeText(getApplicationContext(), "Login Success !", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getApplicationContext(), "Login Failed !", Toast.LENGTH_LONG).show();
}
}
void init() {
mBtLogin = findViewById(R.id.btn_login);
mEtUsername = findViewById(R.id.et_username);
mEtPassword = findViewById(R.id.et_password);
mLoginPresenter = new LoginPresenter(this);
}
}
Presenter
LoginPresenterInterface
public interface LoginPresenterInterface {
void loginButtonClicked(String username, String password);
}
LoginPresenter
public class LoginPresenter implements LoginPresenterInterface {
private LoginViewInterface mLoginView;
private LoginModelInterface mLoginModel;
public LoginPresenter(LoginViewInterface loginView) {
mLoginView = loginView;
mLoginModel = new LoginModel();
}
@Override
public void loginButtonClicked(String username, String password) {
boolean isValid = mLoginModel.isUserValid(username, password);
mLoginView.showLoginResult(isValid);
}
}
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |