一 、MVP(Model-View-Presenter)概叙
MVP(Model-View-Presenter)是一种用于Android应用程序开发的架构模式,旨在将应用程序的不同部分分离,以提高代码的可维护性和可测试性。MVP模型包含三个主要组成部分:Model、View和Presenter。
-
Model (模型):
Model负责处理应用程序的数据和业务逻辑。它从数据源获取数据,并执行数据处理和保存操作。Model通常不包含任何与用户界面(UI)相关的代码,它专注于数据的获取和操作。
-
View (视图):
View负责显示数据并呈现用户界面。它接收用户的输入并将这些输入传递给Presenter进行处理。View不直接处理数据逻辑或业务逻辑,它只是通过Presenter与Model交互。
-
Presenter (主持人):
Presenter作为Model和View之间的中介,处理从View传递过来的用户输入,并调用Model来获取或更新数据。然后,它将处理后的数据传递回View进行显示。Presenter不直接处理UI的具体实现,它关注的是业务逻辑和数据的处理。
二、MVP的简单使用
model:
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public boolean isValid() {
return username.equals("admin") && password.equals("password");
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}
Presenter:
public class LoginPresenter {
private LoginView loginView;
public LoginPresenter(LoginView loginView) {
this.loginView = loginView;
}
public void validateCredentials(String username, String password) {
User user = new User(username, password);
if (username.isEmpty()) {
loginView.setUsernameError();
return;
}
if (password.isEmpty()) {
loginView.setPasswordError();
return;
}
if (user.isValid()) {
loginView.navigateToHome();
} else {
loginView.setPasswordError();
}
}
}
interface:
public interface LoginView {
void setUsernameError();
void setPasswordError();
void navigateToHome();
}
activity:
public class MainActivity extends AppCompatActivity implements LoginView {
private EditText username;
private EditText password;
private Button loginButton;
private LoginPresenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
username = findViewById(R.id.username);
password = findViewById(R.id.password);
loginButton = findViewById(R.id.login_button);
loginPresenter = new LoginPresenter(this);
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginPresenter.validateCredentials(username.getText().toString(), password.getText().toString());
}
});
}
@Override
public void setUsernameError() {
username.setError(getString(R.string.username_error));
}
@Override
public void setPasswordError() {
password.setError(getString(R.string.password_error));
}
@Override
public void navigateToHome() {
Toast.makeText(this, "Login Successful", Toast.LENGTH_SHORT).show();
}
}
xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/username_hint" />
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/password_hint"
android:inputType="textPassword" />
<Button
android:id="@+id/login_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/login" />
<Button
android:id="@+id/register_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/register" />
</LinearLayout>
三、总结
-
View调用Presenter
View
层捕获用户的操作,并通过调用Presenter
的方法来请求数据或触发业务逻辑
-
Presenter调用Model
Presenter
接收到来自View
的请求后,执行相应的业务逻辑。通常,Presenter
会调用Model
层来请求数据或执行操作。
-
Model处理数据并回调Presenter
Model
层处理请求的数据操作,如从数据库或网络获取数据。操作完成后,Model
会通过回调或接口将数据或操作结果通知Presenter
。这种回调机制通常通过Model
定义的接口来实现。
-
Presenter处理结果并更新View
Presenter接收到
Model的回调后,处理数据并根据结果决定如何更新
View`。
-
View更新UI
View
根据从Presenter
接收到的数据或指令,更新用户界面。这包括显示数据、更新文本框、导航到新界面等。