Android MVP模式的初识
? MVP是什么?或許在之前更多的人知道的是MVC這個(gè)模式(Model View Controller),然而MVP與MVC最不同的一點(diǎn)是M與V是不直接
關(guān)聯(lián)的也是就Model與View不存在直接關(guān)系,這兩者之間間隔著的是Presenter層。個(gè)人感覺這是一種很棒的設(shè)計(jì),讓代碼能夠?qū)崿F(xiàn)充分的解耦。
那么我們還是沒有講到MVP是什么~~~不要急,我會用最簡單的方式來敘述,這樣好理解~
?
M(Model):為UI層提供數(shù)據(jù),或者是保存UI層的數(shù)據(jù);
?
V(View) :單純的數(shù)據(jù)展示,響應(yīng)用戶的操作并且都轉(zhuǎn)發(fā)給Presenter來做具體的處理;
P(Presenter):邏輯控制層,從Model處取數(shù)據(jù),運(yùn)算和轉(zhuǎn)化,最后用View來展示;并處理View傳過來的用戶事件,并做處理;
是不是覺得一目了然了呢~很多第一次學(xué)習(xí)設(shè)計(jì)模式的都會有一個(gè)這樣的疑問,就是設(shè)計(jì)模式這種東西聽上去好像很高大上,那么在什么情
況下我們就應(yīng)該使用MVP這種設(shè)計(jì)模式呢?其實(shí):
- 基本上都可以,哪怕只有一個(gè)登錄的功能,也都是可以使用MVP的,我們初學(xué)MVP肯定目標(biāo)是學(xué)習(xí),所以以掌握知識為重,等到理解了,大的項(xiàng)目就 ? ? ?可以使用了;
- MVP它是一個(gè)方法論的東西,沒有固定的實(shí)現(xiàn)方式,只要能體現(xiàn)出它的方法就可以算是MVP。
當(dāng)然,我們上述所說的感覺給人一點(diǎn)華而不實(shí)的感覺,畢竟就這么說誰也不知道MVP到底怎么用,還是要有一點(diǎn)點(diǎn)小規(guī)則反而會比較好讓我們
去理解:
- Model與View不能直接通信,只能通過Presenter
- Presenter類似于中間人的角色進(jìn)行協(xié)調(diào)和調(diào)度
- Model和View是接口,Presenter持有的是一個(gè)Model接口和一個(gè)View接口
- Model和View都應(yīng)該是被動(dòng)的,一切都由Presenter來主導(dǎo)
- Model應(yīng)該把與業(yè)務(wù)邏輯層的交互封裝掉,換句話說Presenter和View不應(yīng)該知道業(yè)務(wù)邏輯層
- View的邏輯應(yīng)該盡可能的簡單,不應(yīng)該有狀態(tài)。當(dāng)事件發(fā)生時(shí),調(diào)用Presenter來處理,并且不傳參數(shù),Presenter處理時(shí)再調(diào)用View的方法來獲取。
我們很容易看出,關(guān)鍵的地方還是在Presenter上面,可以說Presenter就是我們整個(gè)MVP設(shè)計(jì)模式的核心部分,那么理論上說了這么多,具體怎么落實(shí)呢?
在Android中的實(shí)現(xiàn)
MVP是一個(gè)方法論的東西,也就是沒有任何固定的具體的實(shí)現(xiàn)形式,只要能夠把View跟Model解除聯(lián)系,把邏輯都放在Presenter中,那么就能算
得上是MVP,一些具體的實(shí)踐的指導(dǎo)性原則:
- View是一個(gè)接口,負(fù)責(zé)被動(dòng)的把處理好的數(shù)據(jù)顯示出來
- Model也是一個(gè)接口,負(fù)責(zé)獲取數(shù)據(jù)和存儲數(shù)據(jù)
- View調(diào)用Presenter處理用戶事件也是一個(gè)接口,稱為事件Delegate
- Presenter持有的是View的接口和Model接口
接下來我們使用一個(gè)登陸的例子來說明:
登陸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(); } 實(shí)現(xiàn)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中實(shí)現(xiàn)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的理解就更加深刻了一點(diǎn)呢,如果沒有看懂最好是自己動(dòng)手敲一遍,會理解的更快哦~~~~~
?
轉(zhuǎn)載于:https://www.cnblogs.com/liuzhenlong/p/5229487.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Android MVP模式的初识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 兼容性好的overflow CSS清除浮
- 下一篇: android sina oauth2.