日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android MVP模式的初识

發(fā)布時(shí)間:2024/4/17 Android 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android MVP模式的初识 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?    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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。