一、简介

随着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 ;
} public UserBean Load(int id)
{
// 查数据库或者联网获取id的userbean
return new UserBean("", "");
} 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模式的更多相关文章

  1. android MVP模式介绍与实战

    android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...

  2. Android MVP模式

    转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...

  3. Android MVP模式 简单易懂的介绍方式

    主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200

  4. Android MVP模式简单易懂的介绍方式 (三)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 讲完M和P,接下来就要讲V了.View ...

  5. Android MVP模式简单易懂的介绍方式 (二)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...

  6. Android MVP模式简单易懂的介绍方式 (一)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...

  7. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

  8. Android mvp模式、mvvm模式

    MVC和MVP的区别2007年08月08日 星期三 上午 09:23 MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会 ...

  9. Android MVP模式就是这么回事儿

    MVP模式 概念就不说了,大家都懂.View层通过Persenter层相互通信,避免了View中大量的业务代码,而将其提取到Model中.其实简单的来说,就是通过接口回调,把业务分离出去.提高代码的可 ...

随机推荐

  1. Qt窗体关闭时,如何自动销毁窗体类对象

    Qt窗体关闭时,如何自动销毁窗体类对象     要对你的窗口设置WA_DeleteOnClose属性,默认的情况下关闭窗口仅仅意味着隐藏它 ImgWindow1->setAttribute(Qt ...

  2. 微信小程序购物商城系统开发系列

    微信小程序购物商城系统开发系列 微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操作系统. ...

  3. RHEL 6.4中解决xx用户不在sudoers列表,此事将被报告的问题

    1.使用sudo service iptables status命令时报告没有权限: [tansheng@localhost ~]$ sudo service iptables status [sud ...

  4. Think in java备忘录

    1..new在内部类中的使用 .new可以用使用外部类对象创建一个内部类,对象 DotNew.java package com.gxf.innerclass; public class DotNew ...

  5. 团队开发——第一篇scrum报告

    一.角色介绍 产品负责人(兼项目经理PM):王雪青 scrum master: 陆宇 开发团队:赵建松.张文冬.徐擎天 二.product backlog 1.买家登录后,显示各个小吃摊的信息,主要是 ...

  6. npm ERR!无法安装任何包的解决办法

    npm ERR! Windows_NT 6.1.7601npm ERR! argv "E:\\node\\\\node.exe" "E:\\node\\node_modu ...

  7. Node.js 学习(二) 创建第一个应用

    如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 ...

  8. 农行网银软件导致XP死机

    一台PC电脑安装了XP系统,突然会大约30分钟左右死机,键盘(CTRL+ALT+DEL)和鼠标都没反应,只能强行关机后重新开机.因为是用了几年的电脑,担心热稳定性问题,打开机箱后,发现CPU风扇很多灰 ...

  9. Spring MVC 环境搭建(一)

    一.建立 JavaWeb 项目 1.建立一个 Java 项目. 2.在项目下新建一个文件夹 webapp (命名可自取,这个目录即是网站根目录),再在该文件夹下新建一个 WEB-INF 文件夹(命名固 ...

  10. svn 检出 Check out 请求的名称有效,但是找不到请求的类型的数据。

    根据问题不同有不同的解决方案,可按照以下方法进行解决1.取消TortoiseSVN-网络-代理2.确认SVN目录地址是否正确,可在浏览器中直接打开测试.如地址是由计算机名组成请改成Ip地址进行测试