標籤:
一、簡介
隨著UI建立技術的功能日益增強,UI層也履行著越來越多的職責。為了更好地細分視圖(View)與模型(Model)的功能,讓View專註於處理數 據的可視化以及與使用者的互動,同時讓Model只關係資料的處理,基於MVC概念的MVP(Model-View-Presenter)模式應運而生。
在MVP模式裡通常包含4個要素:
View:負責繪製UI元素、與使用者進行互動(在Android中體現為Activity);
View interface:需要View實現的介面,View通過View interface與Presenter進行互動,降低耦合,方便進行單元測試;
Model:負責儲存、檢索、操縱資料(有時也實現一個Model interface用來降低耦合);
Presenter:作為View與Model互動的中間紐帶,處理與使用者互動的負責邏輯。所謂的MVP,即是(model-處理商務邏輯(主要是資料讀寫,或者與後台通訊(其實也是讀寫資料)),view-處理ui控制項,presenter-主導器,操作model和view)二、執行個體
1.建立一個項目,項目結構如下
2.做一個根據id讀取資料的執行個體,介面如下
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/id" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="輸入id" android:inputType="number" /> <EditText android:id="@+id/first" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="inter first name" android:inputType="text" /> <EditText android:id="@+id/last" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="inter last name" android:inputType="text" /> <Button android:id="@+id/save" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="save" /> <Button android:id="@+id/load" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="load" /></LinearLayout>
View Code
3.建立bean
public class UserBean { private String mFirstName { get; set; } private String mLastName { get; set; } public UserBean(String firstName, String lastName) { this.mFirstName = firstName; this.mLastName = lastName; } }
4.建立model(處理商務邏輯),先寫介面,後寫實現
public interface IUserModel { void SetID(int id); void SetFirstName(String firstName); void SetLastName(String lastName); int GetID(); UserBean Load(int id);// 通過id讀取user資訊,返回一個UserBean }
public class UserModel : IUserModel { public int GetID() { return 0; } public UserBean Load(int id) { // 查資料庫或者連網擷取id的userbean return new UserBean("11", "22"); } public void SetFirstName(string firstName) { } public void SetID(int id) { } public void SetLastName(string lastName) { } }
5.建立view(更新ui中view狀態),這裡列出需要操作當前view的方法,也就是介面。
public interface IUserView { int GetID(); String GetFristName(); String GetLastName(); void SetFirstName(String firstName); void SetLastName(String lastName); }
6.建立presenter(主導器,通過ivew和imodel介面操作model和view),activity可以把所有邏輯給presenter處理
public class UserPresenter { private IUserView mUserView; private IUserModel mUserModel; public UserPresenter(IUserView view) { mUserView = view; mUserModel = new UserModel(); } public void SaveUser(int id, String firstName, String lastName) { mUserModel.SetID(id); mUserModel.SetFirstName(firstName); mUserModel.SetLastName(lastName); } public void LoadUser(int id) { UserBean user = mUserModel.Load(id); mUserView.SetFirstName(user.mFirstName); // 通過調用IUserView的方法來更新顯示 mUserView.SetLastName(user.mLastName); } }
7.activity中實現iview介面,在其中操作view,執行個體化一個presenter變數。
public class MainActivity : Activity, IUserView, View.IOnClickListener { UserPresenter presenter; EditText id, first, last; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); // Get our button from the layout resource, // and attach an event to it FindViewById<Button>(Resource.Id.save).SetOnClickListener(this); FindViewById<Button>(Resource.Id.load).SetOnClickListener(this); ; id = FindViewById<EditText>(Resource.Id.id); first = FindViewById<EditText>(Resource.Id.first); last = FindViewById<EditText>(Resource.Id.last); presenter = new UserPresenter(this); } public int GetID() { return Convert.ToInt32(id.Text.ToString()); } public string GetFristName() { return first.Text.ToString(); } public string GetLastName() { return last.Text.ToString(); } public void SetFirstName(string firstName) { first.Text = firstName; } public void SetLastName(string lastName) { last.Text = lastName; } public void OnClick(View v) { switch (v.Id) { case Resource.Id.save: presenter.SaveUser(GetID(), GetFristName(), GetLastName()); break; case Resource.Id.load: presenter.LoadUser(GetID()); break; } } }
7.源碼地址
https://github.com/huguodong/XamarinMVP
裡面又更詳細的執行個體
Xamarin.Android MVP模式