一、什么是MVP
姚安網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,姚安網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為姚安數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的姚安做網(wǎng)站的公司定做!
在網(wǎng)上找了些資料,整理如下:
MVP是模型(Model)、視圖(View)、主持人(Presenter)的縮寫,分別代表項目中3個不同的模塊。
模型(Model):負(fù)責(zé)處理數(shù)據(jù)的加載或者存儲,比如從網(wǎng)絡(luò)或本地數(shù)據(jù)庫獲取數(shù)據(jù)等;
視圖(View):負(fù)責(zé)界面數(shù)據(jù)的展示,與用戶進(jìn)行交互;
主持人(Presenter):相當(dāng)于協(xié)調(diào)者,是模型與視圖之間的橋梁,將模型與視圖分離開來。
如下圖所示,View與Model并不直接交互,而是使用Presenter作為View與Model之間的橋梁。其中Presenter中同時持有Viwe層以及Model層的Interface的引用,而View層持有Presenter層Interface的引用。當(dāng)View層某個界面需要展示某些數(shù)據(jù)的時候,首先會調(diào)用Presenter層的某個接口,然后Presenter層會調(diào)用Model層請求數(shù)據(jù),當(dāng)Model層數(shù)據(jù)加載成功之后會調(diào)用Presenter層的回調(diào)方法通知Presenter層數(shù)據(jù)加載完畢,最后Presenter層再調(diào)用View層的接口將加載后的數(shù)據(jù)展示給用戶。這就是MVP模式的整個核心過程。
在MVP模式里通常包含4個要素:
(1)View:負(fù)責(zé)繪制UI元素、與用戶進(jìn)行交互(在Android中體現(xiàn)為Activity);
(2)View interface:需要View實現(xiàn)的接口,View通過View interface與Presenter進(jìn)行交互,降低耦合,方便進(jìn)行單元測試;
(3)Model:負(fù)責(zé)存儲、檢索、操縱數(shù)據(jù)(有時也實現(xiàn)一個Model interface用來降低耦合);
(4)Presenter:作為View與Model交互的中間紐帶,處理與用戶交互的負(fù)責(zé)邏輯。
二、MVP模式的使用
上面一張簡單的MVP模式的UML圖,從圖中可以看出,使用MVP,至少需要經(jīng)歷以下步驟:
1.創(chuàng)建IPresenter接口,把所有業(yè)務(wù)邏輯的接口都放在這里,并創(chuàng)建它的實現(xiàn)PresenterCompl(在這里可以方便地查看業(yè)務(wù)功能,由于接口可以有多種實現(xiàn)所以也方便寫單元測試)
2.創(chuàng)建IView接口,把所有視圖邏輯的接口都放在這里,其實現(xiàn)類是當(dāng)前的Activity/Fragment
3.由UML圖可以看出,Activity里包含了一個IPresenter,而PresenterCompl里又包含了一個IView并且依賴了Model。Activity里只保留對IPresenter的調(diào)用,其它工作全部留到PresenterCompl中實現(xiàn)
4.Model并不是必須有的,但是一定會有View和Presenter
三、一個簡單的MVP示例
實現(xiàn)一個簡單的用戶登錄
效果如下:
先來看看java文件的目錄結(jié)構(gòu):
1.Baen包
UserBean
package com.example.mvpe.bean; /** * Created by fendo on 2017/4/29. */ public class UserBean { private String username; private String userpwd; public UserBean() { } public UserBean(String username, String userpwd) { this.username = username; this.userpwd = userpwd; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserpwd() { return userpwd; } public void setUserpwd(String userpwd) { this.userpwd = userpwd; } }
2.Model包
IUserModel類
package com.example.mvpe.model; import com.example.mvpe.bean.UserBean; /** * Created by fendo on 2017/4/29. */ public interface IUserModel { void setSid(int cid); UserBean load(int sid); void setUsername(String username); void setUserpwd(String userpwd); }
UserModelimp類
package com.example.mvpe.model; import android.provider.Settings; import android.util.Log; import android.util.SparseArray; import com.example.mvpe.bean.UserBean; /** * Created by fendo on 2017/4/29. */ public class UserModelimp implements IUserModel{ private static final String ACTIVITY_TAG="UserModelimp"; private String username; private String userpwd; private int sid; private SparseArraysu=new SparseArray (); @Override public void setSid(int cid) { sid=cid; } @Override public UserBean load(int sidy) { sid=sidy; UserBean ub=su.get(sid,new UserBean("not found", "not found")); return ub; } @Override public void setUsername(String usernamey) { username=usernamey; } @Override public void setUserpwd(String userpwdy) { userpwd=userpwdy; UserBean usb=new UserBean(username,userpwd); System.out.print(username+"----"+userpwd+"----"+sid); Log.d(UserModelimp.ACTIVITY_TAG, "Start_OK"+username+"----"+userpwd+"----"+sid); su.append(sid,usb); } }
3.persenter包
UserPersenter類
package com.example.mvpe.presenter; import android.util.Log; import android.view.View; import com.example.mvpe.bean.UserBean; import com.example.mvpe.model.IUserModel; import com.example.mvpe.model.UserModelimp; import com.example.mvpe.view.IUserView; /** * Created by fendo on 2017/4/29. */ public class UserPersenter { private static final String ACTIVITY_TAG="UserPersenter"; private IUserView iUserView; private IUserModel iUserModel; public UserPersenter(IUserView view){ iUserView=view; iUserModel=new UserModelimp(); } public void saveuser(int sid,String username,String userpwd){ iUserModel.setSid(sid); iUserModel.setUsername(username); iUserModel.setUserpwd(userpwd); } public void loaduser(int sid){ UserBean usb=iUserModel.load(sid); Log.d(ACTIVITY_TAG, "loaduser: "+usb.getUsername()); iUserView.setUsername(usb.getUsername()); iUserView.setUserpwd(usb.getUserpwd()); } }
4.view包
IUserView類
package com.example.mvpe.view; import com.example.mvpe.bean.UserBean; /** * Created by fendo on 2017/4/29. */ public interface IUserView { int getID(); void setUsername(String username); void setUserpwd(String userpwd); String getUserpwd(); String getUsername(); }
UserActivity類
package com.example.mvpe.view; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.example.mvpe.R; import com.example.mvpe.presenter.UserPersenter; import android.view.View.OnClickListener; import android.widget.Toast; /** * Created by fendo on 2017/4/29. */ public class UserActivity extends Activity implements OnClickListener,IUserView{ private EditText userid; private EditText username; private EditText userpwd; private Button read; private Button write; private UserPersenter usp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); usp=new UserPersenter(this); setContentView(R.layout.activity_main); findviewbyid(); read.setOnClickListener(this); write.setOnClickListener(this); } public void findviewbyid(){ userid= (EditText) findViewById(R.id.userid); username= (EditText) findViewById(R.id.usertext); userpwd= (EditText) findViewById(R.id.userpwd); read= (Button) findViewById(R.id.read); write= (Button) findViewById(R.id.write); } @Override public int getID() { return Integer.parseInt(userid.getText().toString()); } @Override public void setUsername(String usernamcc) { username.setText(usernamcc); } @Override public void setUserpwd(String userpw) { userpwd.setText(userpw); } @Override public String getUserpwd() { return userpwd.getText().toString(); } @Override public String getUsername() { return username.getText().toString(); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.read : usp.loaduser(getID()); Toast.makeText(getApplicationContext(), "點擊了讀"+getID(), Toast.LENGTH_SHORT).show(); break; case R.id.write: usp.saveuser(getID(),getUsername(),getUserpwd()); Toast.makeText(getApplicationContext(), "點擊了存"+getID()+"--"+getUsername()+"--"+getUserpwd(), Toast.LENGTH_SHORT).show(); break; } } }
可以看到View只負(fù)責(zé)處理與用戶進(jìn)行交互,并把數(shù)據(jù)相關(guān)的邏輯操作都扔給了Presenter去做。而Presenter調(diào)用Model處理完數(shù)據(jù)之后,再通過IUserView更新View顯示的信息。
下載:源碼
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。