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>
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
里面又更详细的实例
本文来自博客园,作者:HuTiger,转载请注明原文链接:https://www.cnblogs.com/huguodong/p/5929224.html,欢迎加入qq群927460240学习讨论