柚子快報邀請碼778899分享:【Android】MVP架構(gòu)
柚子快報邀請碼778899分享:【Android】MVP架構(gòu)
MVP架構(gòu)簡介
MVP(Model-View-Presenter)是一種常見的軟件架構(gòu)模式,尤其在Android應(yīng)用開發(fā)中被廣泛使用。它將應(yīng)用程序分為三層:Model、View 和 Presenter,以實現(xiàn)職責(zé)分離,提高代碼的可維護(hù)性和可測試性。
1. Model(模型)
定義:負(fù)責(zé)處理應(yīng)用程序的數(shù)據(jù)邏輯,包括與數(shù)據(jù)庫、網(wǎng)絡(luò)、API等數(shù)據(jù)源的交互。職責(zé):提供數(shù)據(jù),并將其返回給 Presenter,不涉及任何UI相關(guān)邏輯。
2. View(視圖)
定義:負(fù)責(zé)展示用戶界面,接收用戶的輸入并將其傳遞給 Presenter。職責(zé):展示由 Presenter 提供的數(shù)據(jù),并根據(jù)用戶操作調(diào)用 Presenter 的方法。View 層不直接處理邏輯,只展示內(nèi)容。
3. Presenter(演示者)
定義:作為 View 和 Model 之間的橋梁,負(fù)責(zé)處理邏輯和協(xié)調(diào)數(shù)據(jù)流。職責(zé):
從 View 接收用戶輸入,調(diào)用 Model 獲取數(shù)據(jù)。將數(shù)據(jù)處理結(jié)果返回給 View 以更新UI。Presenter 不直接操作UI,而是通過接口與 View 進(jìn)行交互。
MVP與MVC的區(qū)別
1. 核心組成部分的區(qū)別
MVP:
Model:負(fù)責(zé)數(shù)據(jù)邏輯的處理,類似于MVC中的Model。View:展示數(shù)據(jù)、處理用戶界面交互,但不會直接處理業(yè)務(wù)邏輯,所有邏輯都交給 Presenter。Presenter:作為中間層,負(fù)責(zé)從 Model 獲取數(shù)據(jù)并處理業(yè)務(wù)邏輯,然后將數(shù)據(jù)傳遞給 View。Presenter 直接與 View 交互。 MVC:
Model:同樣負(fù)責(zé)數(shù)據(jù)邏輯的處理,與 MVP 中的 Model 類似。View:展示數(shù)據(jù)并處理用戶輸入,但可以直接與 Controller 進(jìn)行交互。Controller:控制器響應(yīng)用戶的輸入,更新 Model 和 View,但它不直接操作 View,而是通知 View 自行更新。
2. 交互方式的區(qū)別
MVP:
View 與 Model 之間沒有直接交互。View 只負(fù)責(zé)調(diào)用 Presenter,Presenter 是唯一能與 Model 交互的部分,然后 Presenter 將結(jié)果返回給 View 來更新界面。雙向交互:View 和 Presenter 是雙向交互的,View 可以調(diào)用 Presenter,Presenter 也可以調(diào)用 View 來更新UI。 MVC:
View 可以直接與 Model 交互。在MVC中,View可以直接從Model中獲取數(shù)據(jù),雖然一般情況下是通過Controller來協(xié)調(diào)。單向交互:View 和 Controller 之間的交互通常是單向的,用戶的輸入會通過 View 傳遞給 Controller,Controller 再更新 Model,最后通知 View 更新UI。
3. 視圖的控制權(quán)
MVP:
Presenter 控制視圖:在MVP模式中,Presenter 負(fù)責(zé)處理所有業(yè)務(wù)邏輯,并決定何時以及如何更新 View。View 不進(jìn)行邏輯處理,只是被動地展示數(shù)據(jù)。 MVC:
Controller 充當(dāng)中介:在MVC中,Controller 只是起到協(xié)調(diào)作用,它不會主動控制 View 的更新,通常會將新的數(shù)據(jù)傳遞給 View 或通知 View 進(jìn)行自我更新。
MVP架構(gòu)優(yōu)點
View層與Model層完全分離 所有View層 和 Model層 邏輯交互都在Presenter 后續(xù)擴(kuò)展性/可維護(hù)性強(qiáng),M層(負(fù)責(zé)數(shù)據(jù)業(yè)務(wù)模型), P層(負(fù)責(zé)M層與V層的交互邏輯) 定位修改Bug方便: 如果是修改界面交互相關(guān)的,直接找V層修改 如果是修改數(shù)據(jù)業(yè)務(wù)邏輯,直接找M層修改
MVP架構(gòu)特點
關(guān)系:
View收到用戶的操作 View把用戶的操作,交給Presenter Presenter直接操作Model進(jìn)行業(yè)務(wù)邏輯處理 Model處理完畢后,通知Presenter Presneter收到通知后,在去更新View
方式:
是雙向的通信方式
優(yōu)點:
View層與Model層完全分離所有的邏輯交互都在PresenterMVP分層較為嚴(yán)謹(jǐn)
示例
Model (數(shù)據(jù)層)
Model 負(fù)責(zé)處理數(shù)據(jù)邏輯,判斷用戶名和密碼是否正確。
public class LoginModel {
// 模擬用戶登錄數(shù)據(jù)
public boolean validateUser(String username, String password) {
// 簡單模擬,假設(shè)用戶名為"user",密碼為"password"時登錄成功
return username.equals("user") && password.equals("password");
}
}
View (視圖層)
View 負(fù)責(zé)顯示界面,并將用戶的輸入傳遞給 Presenter,它不會直接處理業(yè)務(wù)邏輯。
public interface LoginView {
// 展示登錄成功的信息
void showLoginSuccess();
// 展示登錄失敗的信息
void showLoginError();
// 獲取用戶名
String getUsername();
// 獲取密碼
String getPassword();
}
具體實現(xiàn):
public class LoginActivity extends AppCompatActivity implements LoginView {
private EditText usernameEditText, passwordEditText;
private Button loginButton;
private LoginPresenter presenter;
@Override
protected 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() {
@Override
public void onClick(View v) {
presenter.onLoginClicked();
}
});
}
@Override
public void showLoginSuccess() {
Toast.makeText(this, "登錄成功", Toast.LENGTH_SHORT).show();
}
@Override
public void showLoginError() {
Toast.makeText(this, "登錄失敗", Toast.LENGTH_SHORT).show();
}
@Override
public String getUsername() {
return usernameEditText.getText().toString();
}
@Override
public String getPassword() {
return passwordEditText.getText().toString();
}
}
Presenter (邏輯層)
Presenter 負(fù)責(zé)處理業(yè)務(wù)邏輯,并將數(shù)據(jù)從 Model 傳遞到 View。
public class LoginPresenter {
private LoginView view;
private LoginModel model;
public LoginPresenter(LoginView view, LoginModel model) {
this.view = view;
this.model = model;
}
// 當(dāng)用戶點擊登錄按鈕時調(diào)用
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)
簡單的登錄界面,包含輸入框和按鈕。
android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp"> android:id="@+id/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="用戶名" /> android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="密碼" android:inputType="textPassword" />
工作流程:
用戶在 LoginActivity 中輸入用戶名和密碼并點擊登錄按鈕。LoginActivity 作為 View 層,將用戶輸入傳遞給 LoginPresenter。LoginPresenter 從 View 獲取用戶名和密碼,并調(diào)用 LoginModel 來驗證用戶輸入。LoginModel 驗證輸入是否正確,然后將結(jié)果返回給 LoginPresenter。LoginPresenter 根據(jù)驗證結(jié)果通知 LoginActivity 更新UI,顯示登錄成功或失敗的消息。
已經(jīng)到底啦?。?/p>
柚子快報邀請碼778899分享:【Android】MVP架構(gòu)
好文閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。