首页 > 代码库 > Xamarin.Android MVP模式

Xamarin.Android MVP模式

一、简介

随着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模式