Android MVP模式的初识
生活随笔
收集整理的這篇文章主要介紹了
Android MVP模式的初识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? MVP是什么?或許在之前更多的人知道的是MVC這個模式(Model View Controller),然而MVP與MVC最不同的一點是M與V是不直接
關聯的也是就Model與View不存在直接關系,這兩者之間間隔著的是Presenter層。個人感覺這是一種很棒的設計,讓代碼能夠實現充分的解耦。
那么我們還是沒有講到MVP是什么~~~不要急,我會用最簡單的方式來敘述,這樣好理解~
?
M(Model):為UI層提供數據,或者是保存UI層的數據;
?
V(View) :單純的數據展示,響應用戶的操作并且都轉發給Presenter來做具體的處理;
P(Presenter):邏輯控制層,從Model處取數據,運算和轉化,最后用View來展示;并處理View傳過來的用戶事件,并做處理;
是不是覺得一目了然了呢~很多第一次學習設計模式的都會有一個這樣的疑問,就是設計模式這種東西聽上去好像很高大上,那么在什么情
況下我們就應該使用MVP這種設計模式呢?其實:
- 基本上都可以,哪怕只有一個登錄的功能,也都是可以使用MVP的,我們初學MVP肯定目標是學習,所以以掌握知識為重,等到理解了,大的項目就 ? ? ?可以使用了;
- MVP它是一個方法論的東西,沒有固定的實現方式,只要能體現出它的方法就可以算是MVP。
當然,我們上述所說的感覺給人一點華而不實的感覺,畢竟就這么說誰也不知道MVP到底怎么用,還是要有一點點小規則反而會比較好讓我們
去理解:
- Model與View不能直接通信,只能通過Presenter
- Presenter類似于中間人的角色進行協調和調度
- Model和View是接口,Presenter持有的是一個Model接口和一個View接口
- Model和View都應該是被動的,一切都由Presenter來主導
- Model應該把與業務邏輯層的交互封裝掉,換句話說Presenter和View不應該知道業務邏輯層
- View的邏輯應該盡可能的簡單,不應該有狀態。當事件發生時,調用Presenter來處理,并且不傳參數,Presenter處理時再調用View的方法來獲取。
我們很容易看出,關鍵的地方還是在Presenter上面,可以說Presenter就是我們整個MVP設計模式的核心部分,那么理論上說了這么多,具體怎么落實呢?
在Android中的實現
MVP是一個方法論的東西,也就是沒有任何固定的具體的實現形式,只要能夠把View跟Model解除聯系,把邏輯都放在Presenter中,那么就能算
得上是MVP,一些具體的實踐的指導性原則:
- View是一個接口,負責被動的把處理好的數據顯示出來
- Model也是一個接口,負責獲取數據和存儲數據
- View調用Presenter處理用戶事件也是一個接口,稱為事件Delegate
- Presenter持有的是View的接口和Model接口
接下來我們使用一個登陸的例子來說明:
登陸View的接口:
public interface ILoginView {void clearEditText();void showProgress();void hideProgress();void setUsernameError();void setPasswordError();String getUsername();String getPassword();void loginSuccess();}登陸Presenter接口: public interface ILoginPresenter {void doLogin(String username, String password);void clear();void onDestroy(); } 實現Presenter接口: public class LoginPresenter implements ILoginPresenter {private ILoginView mLoginView;private User mUser;public LoginPresenter(ILoginView loginView) {this.mLoginView = loginView;initUser();}private void initUser() {mUser = new User(mLoginView.getUsername(), mLoginView.getPassword());}@Overridepublic void doLogin(String username, String password) {mLoginView.showProgress();new Handler().postDelayed(new Runnable() {@Overridepublic void run() {mLoginView.hideProgress();int code = mUser.checkUserValidity(mLoginView.getUsername(), mLoginView.getPassword());if (code == -1) {mLoginView.setPasswordError();} else if (code == 0) {mLoginView.loginSuccess();}}}, 2000);}@Overridepublic void clear() {mLoginView.clearEditText();}@Overridepublic void onDestroy() {mLoginView = null;} }
定義Model:
public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public User(String username, String password) {this.username = username;this.password = password;}public int checkUserValidity(String username, String password) {if (username == null || password == null ||username.isEmpty() ||password.isEmpty()) {return -1;}return 0;} }在Activity中實現view:
public class LoginActivity extends AppCompatActivityimplements ILoginView, View.OnClickListener {private ILoginPresenter mLoginPresenter;@Bind(R.id.et_username)EditText etUsername;@Bind(R.id.et_passwrod)EditText etPasswrod;@Bind(R.id.bt_enter)Button btEnter;@Bind(R.id.bt_clear)Button btClear;@Bind(R.id.progress)ProgressBar progress;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);mLoginPresenter = new LoginPresenter(this);btEnter.setOnClickListener(this);btClear.setOnClickListener(this);}@Overridepublic void clearEditText() {etPasswrod.setText("");etUsername.setText("");}@Overridepublic void showProgress() {progress.setVisibility(View.VISIBLE);}@Overridepublic void hideProgress() {progress.setVisibility(View.GONE);}@Overridepublic void setUsernameError() {etUsername.setError("username error");}@Overridepublic void setPasswordError() {etPasswrod.setError("password error");}@Overridepublic String getUsername() {return etUsername.getText().toString();}@Overridepublic String getPassword() {return etPasswrod.getText().toString();}@Overridepublic void loginSuccess() {//start act MainToast.makeText(this, "login success", Toast.LENGTH_SHORT);finish();}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.bt_clear:mLoginPresenter.clear();break;case R.id.bt_enter:mLoginPresenter.doLogin(etUsername.getText().toString(),etPasswrod.getText().toString());break;}}@Overrideprotected void onDestroy() {mLoginPresenter.onDestroy();super.onDestroy();} }這樣一來是不是對MVP的理解就更加深刻了一點呢,如果沒有看懂最好是自己動手敲一遍,會理解的更快哦~~~~~
?
轉載于:https://www.cnblogs.com/liuzhenlong/p/5229487.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Android MVP模式的初识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兼容性好的overflow CSS清除浮
- 下一篇: 【opencv】图像细化