MVP即Model-View-Presenter,是从经典的MVC演变而来的,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理、Model提供数据、View负责显示。

一,结构

  在MVP中,View并不直接与Model通信,而是通过Presenter间接进行的,即所有的交互都发生在Presenter内部,以改进:

1
2
3
4
5
6
void View::onKeyDown() override 
{
std::cout << "View: mpModel->getData() < 100 ?" << std::endl;
if (mpModel->getData() < 100) // 可发现,因为View能访问Model,所以此处仍有业务逻辑代码
mpController->increaseData();
}

  区别在于,MVC是系统级的架构,而MVP是用在某个特定页面上的,也就是说MVP的灵活性要远远大于MVC(因为所有业务代码均放置在Presenter中),实现起来也极为简单。

二,优缺点

优点
  • 模型与视图完全分离,使得修改视图不影响模型
  • 能更高效地使用模型,因为所有的交互都发生在Presenter内部
  • 一个Presenter可用于多个视图,而不需要改变Presenter的逻辑(视图的变化总是比模型的变化频繁)
  • 可脱离用户接口(View)进行单元测试(Presenter中的业务逻辑)
缺点

  由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁。还有一点需要明白,如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。比如说,原本用来呈现Html的Presenter现在也需要用于呈现Pdf了,那么视图很有可能也需要变更。

  详情请参考百度百科——MVP

三,代码示例

模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class  : public AbstractModel
{
public:
Model() { mData = 98; } int getData() override { return mData; }
void setData(int data) override
{
mData = data;
std::cout << "Model: data is updated" << std::endl;
} private:
int mData;
};
视图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class View : public AbstractView
{
public:
View(AbstractPresenter* pPresenter)
{
mpPresenter = pPresenter;
// 省略了一些控件变量...
} void display(int data) override // 由Presenter决定显示具体的数据
{
std::cout << "View: Display " << data << std::endl;
} void onKeyDown() override
{
std::cout << "View: call mpPresenter to handle it" << std::endl;
mpPresenter->increaseData(); // 将所有业务代码交由Presenter处理
} private:
AbstractPresenter* mpPresenter;
};
主持者
1
2
3
4
5
大专栏  MVP简要示例span class="line">6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Presenter : public AbstractPresenter
{
public:
Presenter(AbstractModel* pModel)
{
mpModel = pModel;
mpView = new View(this);
mpView->display(pModel->getData()); /* 为简单起见,在此处模拟用户点击了五次按钮 */
std::cout << "User: onKeyDown" << std::endl;
mpView->onKeyDown();
std::cout << "User: onKeyDown" << std::endl;
mpView->onKeyDown();
std::cout << "User: onKeyDown" << std::endl;
mpView->onKeyDown();
std::cout << "User: onKeyDown" << std::endl;
mpView->onKeyDown();
std::cout << "User: onKeyDown" << std::endl;
mpView->onKeyDown();
}
~Presenter() { delete mpView; } void increaseData() override
{
std::cout << "Presenter: mpModel->getData() < 100 ?" << std::endl;
if (mpModel->getData() < 100)
{
std::cout << "Presenter: increaseData" << std::endl;
mpModel->setData(mpModel->getData() + 1);
std::cout << "Presenter: send the data which needs displaying" << std::endl;
mpView->display(mpModel->getData());
}
} private:
AbstractModel* mpModel;
AbstractView* mpView;
};
主程序及运行结果
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
/* 可通过多态更换视图、模型、主持者 */
AbstractModel* pModel = new Model;
AbstractPresenter* pPresenter = new Presenter(pModel); // 视图已经内置到主持者里,亦可将其分离出来
delete pPresenter;
// ......
delete pModel; // 假设该Model的生命周期与整个软件相等 system("pause");
return 0;
}

附:完整源码包

四,推荐学习

项目介绍

  待办事项软件(Android、MVP),它是谷歌提供用于学习的其中一个项目样例。README.md文件已对其作出相应的说明,此处不再赘述。另外,可查看其它分支学习如何使用其它的框架实现该应用软件。

给完全小白的一些建议
  • Clone该项目或下载其Zip后解压后,使用Android Studio打开该项目
  • 点击菜单栏Build下的”Make Project”,若失败根据提示进行操作即可,直至成功
  • 点击菜单栏Run下的”Run ‘app’”
  • 在真实安卓机或虚拟安卓机下了解该软件的实际运行情况
  • MVP框架相关的代码分析
  • 体会、总结其组织、规范相关接口代码的方式

MVP简要示例的更多相关文章

  1. 转:Android官方MVP架构示例项目解析

    转自: http://www.infoq.com/cn/articles/android-official-mvp-architecture-sample-project-analysis 作者 吕英 ...

  2. Google官方MVP模式示例项目解析 todo-mvp

    转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6700668.html 引言:在Google没有给出一套权威的架构实现之前,很多App项目在架构方面都有或多 ...

  3. Quartz.net一个简要示例

    下面描述了一个Quartz.net最常用的应用场景,按特定秒数触发执行特定任务. 1.任务要继承自:IJob,在Execute方法中填入自己需要执行的任务. public virtual void E ...

  4. 如何使用MVP+Dagger2+RxJava+Retrofit开发(1)

    概述 在2016年5,6月份开始在知乎上看到开发方法,那时候记得是看mvc,mvp,mvvm这三种开发模式区别,后面进一步了解到google在github上开源了使用这3种模式进行Android开发的 ...

  5. 开发 Material Design+RxJava+Retrofit+MVP App 参考资料

    前言     在开发一个基于 Material Design+RxJava+Retrofit+MVP 框架的 App 过程中学习的资料整理 —— 由G军仔分享 这里记录了我开发 大象 项目时,所学习的 ...

  6. MVP架构模式

    概念解释 MVP是Model(数据) View(界面) Presenter(表现层)的缩写,它是MVC架构的变种,强调Model和View的最大化解耦和单一职责原则 Model:负责数据的来源和封装, ...

  7. Theano 更多示例

    Logistic函数 logistic函数的图,其中x在x轴上,s(x)在y轴上. 如果你想对双精度矩阵上的每个元素计算这个函数,这表示你想将这个函数应用到矩阵的每个元素上. 嗯,你是这样做的: x= ...

  8. 封装:简要介绍自定义开发基于WPF的MVC框架

    原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...

  9. 【C#】分享一个可携带附加消息的增强消息框MessageBoxEx

    --------------201507160917更新--------------- 无意中发现标准消息框在Windows7是有声音的,只是在Windows server 2008(R2)无声,而我 ...

随机推荐

  1. css 居中布局方案

    position(transform css3  有些浏览器不兼容) <article id="one"> <section id="section&q ...

  2. 18 12 18 给服务器添加logging 日志功能

    Python中有个logging模块可以完成相关信息的记录,在debug时用它往往事半功倍 1. 日志级别 日志一共分成5个等级,从低到高分别是: DEBUG INFO WARNING ERROR C ...

  3. codeforces 596 C. p-binary

    题意:给你一个n和一个p,让你用 (2k+p)进制来表示n,找出用最少的(2k+p)来表示n. 分析:首先我们看到2k,首先下想到二进制,我们可以我们列出式子,也就是 (2x1 + p)+(2x2 + ...

  4. POJ 2528 Mayor‘s poster 线段树+离散化

    给一块最大为10^8单位宽的墙面,贴poster,每个poster都会给出数据 a,b,表示该poster将从第a单位占据到b单位,新贴的poster会覆盖旧的,最多有10^4张poster,求最后贴 ...

  5. 实验吧web--易--后台登陆

    题目地址:http://www.shiyanbar.com/ctf/2036 这道题确实有点考研脑洞了. 1.首先,查看网页源代码(Ctrl+U),会发现一段PHP代码: $sql = "S ...

  6. 【Pytyon模块】logging模块-日志处理

    一.日志相关概念 1.日志的作用 通过log的分析,可以方便用户了解系统或软件.应用的运行情况:如果你的应用log足够丰富,也可以分析以往用户的操作行为.类型喜好.地域分布或其他更多信息:如果一个应用 ...

  7. idea新建文件模板 (以xml文件为例)

    https://blog.csdn.net/li1325169021/article/details/93158207 偷个懒

  8. 3. 现代 javascript 数组专题 和 对象专题

    数组专题 展开运算符 使用...符号, 可以将数组"展开". 数组展开的妙用 ... eg: // 代替apply const foo = [1, 2, 3] const bar ...

  9. HDU 2586 How far away ?【LCA模板题】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给你N个点,M次询问.1~N-1行输入点与点之间的权值,之后M行输入两个点(a,b)之间的最 ...

  10. dfs--汉诺塔

    在研究汉诺塔问题时,我们可以先分析俩个盘子的方法: 1.把第一个盘子放到辅助柱子上 2.把第二个盘子放大目标柱子上 3.把第一个盘子从辅助柱子移到目标柱子上 由此我们可以通过整体思想推导出一共有n个盘 ...