网页设计与网站架设,静态网站开发语言有哪些,论坛购物网站开发,怎么用云主机做网站MVP架构简介
MVP#xff08;Model-View-Presenter#xff09;是一种常见的软件架构模式#xff0c;尤其在Android应用开发中被广泛使用。它将应用程序分为三层#xff1a;Model、View 和 Presenter#xff0c;以实现职责分离#xff0c;提高代码的可维护性和可测试性。 …MVP架构简介
MVPModel-View-Presenter是一种常见的软件架构模式尤其在Android应用开发中被广泛使用。它将应用程序分为三层Model、View 和 Presenter以实现职责分离提高代码的可维护性和可测试性。
1. Model模型
定义负责处理应用程序的数据逻辑包括与数据库、网络、API等数据源的交互。职责提供数据并将其返回给 Presenter不涉及任何UI相关逻辑。
2. View视图
定义负责展示用户界面接收用户的输入并将其传递给 Presenter。职责展示由 Presenter 提供的数据并根据用户操作调用 Presenter 的方法。View 层不直接处理逻辑只展示内容。
3. Presenter演示者
定义作为 View 和 Model 之间的桥梁负责处理逻辑和协调数据流。职责 从 View 接收用户输入调用 Model 获取数据。将数据处理结果返回给 View 以更新UI。Presenter 不直接操作UI而是通过接口与 View 进行交互。
MVP与MVC的区别
1. 核心组成部分的区别
MVP Model负责数据逻辑的处理类似于MVC中的Model。View展示数据、处理用户界面交互但不会直接处理业务逻辑所有逻辑都交给 Presenter。Presenter作为中间层负责从 Model 获取数据并处理业务逻辑然后将数据传递给 View。Presenter 直接与 View 交互。 MVC Model同样负责数据逻辑的处理与 MVP 中的 Model 类似。View展示数据并处理用户输入但可以直接与 Controller 进行交互。Controller控制器响应用户的输入更新 Model 和 View但它不直接操作 View而是通知 View 自行更新。
2. 交互方式的区别
MVP View 与 Model 之间没有直接交互。View 只负责调用 PresenterPresenter 是唯一能与 Model 交互的部分然后 Presenter 将结果返回给 View 来更新界面。双向交互View 和 Presenter 是双向交互的View 可以调用 PresenterPresenter 也可以调用 View 来更新UI。 MVC View 可以直接与 Model 交互。在MVC中View可以直接从Model中获取数据虽然一般情况下是通过Controller来协调。单向交互View 和 Controller 之间的交互通常是单向的用户的输入会通过 View 传递给 ControllerController 再更新 Model最后通知 View 更新UI。
3. 视图的控制权
MVP Presenter 控制视图在MVP模式中Presenter 负责处理所有业务逻辑并决定何时以及如何更新 View。View 不进行逻辑处理只是被动地展示数据。 MVC Controller 充当中介在MVC中Controller 只是起到协调作用它不会主动控制 View 的更新通常会将新的数据传递给 View 或通知 View 进行自我更新。
MVP架构优点 View层与Model层完全分离 所有View层 和 Model层 逻辑交互都在Presenter 后续扩展性/可维护性强M层(负责数据业务模型) P层(负责M层与V层的交互逻辑) 定位修改Bug方便 如果是修改界面交互相关的直接找V层修改 如果是修改数据业务逻辑直接找M层修改 MVP架构特点
关系 View收到用户的操作 View把用户的操作交给Presenter Presenter直接操作Model进行业务逻辑处理 Model处理完毕后通知Presenter Presneter收到通知后在去更新View
方式
是双向的通信方式
优点
View层与Model层完全分离所有的逻辑交互都在PresenterMVP分层较为严谨 示例
Model (数据层)
Model 负责处理数据逻辑判断用户名和密码是否正确。
public class LoginModel {// 模拟用户登录数据public boolean validateUser(String username, String password) {// 简单模拟假设用户名为user密码为password时登录成功return username.equals(user) password.equals(password);}
}View (视图层)
View 负责显示界面并将用户的输入传递给 Presenter它不会直接处理业务逻辑。
public interface LoginView {// 展示登录成功的信息void showLoginSuccess();// 展示登录失败的信息void showLoginError();// 获取用户名String getUsername();// 获取密码String getPassword();
}具体实现
public class LoginActivity extends AppCompatActivity implements LoginView {private EditText usernameEditText, passwordEditText;private Button loginButton;private LoginPresenter presenter;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);usernameEditText findViewById(R.id.username);passwordEditText findViewById(R.id.password);loginButton findViewById(R.id.login_button);presenter new LoginPresenter(this, new LoginModel());loginButton.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {presenter.onLoginClicked();}});}Overridepublic void showLoginSuccess() {Toast.makeText(this, 登录成功, Toast.LENGTH_SHORT).show();}Overridepublic void showLoginError() {Toast.makeText(this, 登录失败, Toast.LENGTH_SHORT).show();}Overridepublic String getUsername() {return usernameEditText.getText().toString();}Overridepublic String getPassword() {return passwordEditText.getText().toString();}
}Presenter (逻辑层)
Presenter 负责处理业务逻辑并将数据从 Model 传递到 View。
public class LoginPresenter {private LoginView view;private LoginModel model;public LoginPresenter(LoginView view, LoginModel model) {this.view view;this.model model;}// 当用户点击登录按钮时调用public void onLoginClicked() {String username view.getUsername();String password view.getPassword();// 通过 Model 验证用户输入if (model.validateUser(username, password)) {view.showLoginSuccess();} else {view.showLoginError();}}
}布局文件 (activity_login.xml)
简单的登录界面包含输入框和按钮。
LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalandroid:padding16dpEditTextandroid:idid/usernameandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:hint用户名 /EditTextandroid:idid/passwordandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:hint密码android:inputTypetextPassword /Buttonandroid:idid/login_buttonandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:text登录 /
/LinearLayout工作流程
用户在 LoginActivity 中输入用户名和密码并点击登录按钮。LoginActivity 作为 View 层将用户输入传递给 LoginPresenter。LoginPresenter 从 View 获取用户名和密码并调用 LoginModel 来验证用户输入。LoginModel 验证输入是否正确然后将结果返回给 LoginPresenter。LoginPresenter 根据验证结果通知 LoginActivity 更新UI显示登录成功或失败的消息。 已经到底啦