MVP 也就是Model View Presenter模式,是建立一个工程的一种模式。

===================================================================================================================

以下只是基于这个贴子中的例子来说。。只是非常初级的用法和理解

==================================================================================

Model             UI数据层   存放数据,数据更新,获得的方法

View                UI接口   UI层显示  对于一些UI控件的显示方法

Presenter        UI层的逻辑实现 就是将view和model中的数据结合起来,包含model类,通过参数的方法

将model层的数据传入view的函数里面。

==================================================================================

实现了以上那些interface和class后,通过新建一个类,implements view,  重载view中的方法, 具体实现方法,实现UI层控件的显示。

===================================================================================================================

例子分析

本工程建立了

buttonlisten interface, viewinterface , model class ,presenter class, 和应用这些类的大BOSS 实现view的类 hello  class.

1,新建一个view interface ,用于控制UI上 TextView显示的text(会在presenter中将model的数据传进去),和Button 的监听器和显示的text。

package com.example.myapplication2.app;/*** Created by XJ on 2014/5/1.* 界面UI接口*/
public interface view {public void setMess(String  Name,String Motto);//在UI的textview中显示数据public void setClickText(String clickText);//在BUTTON中显示提示信息public void setClickHappen(buttonlisten listen );//为BUTTON绑定监听器,BUTTON实现的功能}

(其中由于有对于button实现的监听,所以需要一个buttonlisten的接口 。。觉得这样很别扭。。有什么更好的方法吗?还是我理解有问题。。?)

package com.example.myapplication2.app;/*** Created by XJ on 2014/5/2.* 接口。用于事件监听*/
public interface buttonlisten {public void click();//在presenter中传入按键事件,需要用到的数据
}

2.新建一个model class ,用于存入工程的数据和获取数据的方法(在我引用的例子里好像没有model类。。。借鉴的例子),然后presenter 会用到这个类,来将数据结合到view中

package com.example.myapplication2.app;/*** Created by XJ on 2014/5/1.* 整个工程的数据存放类*/
public class model
{private final String name="I";private final String motto=" have clicked it ! ";private final String tip="click me!";//button 上显示的提示//获取数据的方法public String GetName(){return  name;}public  String GetMotto(){return  motto;}public String GetTip(){return tip;}}

3.新建一个presenter class 用于结合model和view,在构造函数中调用bind函数,bind函数中将model的数据做为参数传进去 ,然后到实现类中实现。

package com.example.myapplication2.app;/*** Created by XJ on 2014/5/1.* 在presenter中实现把model层的信息放入界面*/
public class presenter {view myView;presenter(view inView){bind(inView);//传入要实现的view}void bind(view inView)//将数据与view结合起来{final model myModel=new model();//定义一个数据类myView=inView;myView.setClickHappen(new buttonlisten() {public void click()//按钮事件的核心{myView.setMess(myModel.GetName(),myModel.GetMotto());//实现在onclick中}});myView.setClickText(myModel.GetTip());//会到实现类中将对应的方法实现myView.setMess("button is"," unclicked");//会到实现类中将对应的方法实现,一开始设置textview中的信息,也可不要}}

4.hello class 这个类继承了view接口,用来具体实现view接口,定义相应的控件,将这个view传入到presenter中,通过presenter的构造函数的bind方法实现方法的调用,在presenter接收了model相应的参数后,会返回到 hello(由于继承了view)里找到对应的重载方法,然后实现。

package com.example.myapplication2.app;import android.app.Activity;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;//这个类通过 生成 view presenter model 来实现一个应用
public class hello extends ActionBarActivity implements view{Button button;TextView textview;buttonlisten myListener;//用于实现监听,@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.mainxml);button = (Button) findViewById(R.id.button);textview  = (TextView) findViewById(R.id.textview);new presenter(this);button.setOnClickListener(new View.OnClickListener() {//点击按钮才会触发public void onClick(View arg0) {myListener.click();}});}///这现就是实现view中的方法的重载。。我觉得是控件与方法的联系@Overridepublic void setClickText(String clickText) {button.setText(clickText);}@Overridepublic void setMess(String  s,String ss) {textview.setText(s+" "+ss );}@Overridepublic void setClickHappen(buttonlisten Listener ) {myListener=Listener;}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.hello, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}

=============================================================================以上就是本人写的例子。。

一开始真的觉得挺难理解的,直到意识到hello类才是具体实现的,(因为和之前做windows phone的那个工程有些不太一样,好像那里不是这样子实现的,但也有model,view差不多的东西。。好吧,那个我也是一知半解。。)在这个类里才有真正的控件和界面,真心觉得创建这种模式的人很了不起,终于有点体会编程也是一种艺术,程序猿也是艺术家了!

对于那个listen还是有点困惑,总觉得这样有点怪怪的,有事件都要通过它来改吗?有更直接的方法吗?自己乱七八糟地试不出来。。。

这些还都只是个人理解。。不知道有没体会到真谛。。还是totally理解错了呢??

第一次写这种解释的东东,也不知道能不能看懂。。。。。。凑合着理解吧,我已经修改很多次了,这里好像不能直接贴图片。。真是不好。。

=============================================================================

我写的这个例子的下载地址。。。  用android studio 写的。。好像是不能在eclipse打开的。。好像是。。而已。。

=============================================================================

老师给的资料

http://magenic.com/BlogArchive/AnMVPPatternforAndroid 解释得挺好的。。但还是例子最实在。。一开始不知道有例子时,就晕在里面了。。

一个例子//就是参照这个例子写的

另一个例子

http://blog.nilenso.com/blog/2013/09/10/android-native-mvp/(这两个没怎么看)

===========================================================================================

1、模型与视图完全分离,我们可以修改视图而不影响模型。
  2、可以更高效地使用模型,因为所有的交互都发生在一个地方 —— Presenter内部。
  3、我们可以将一个Presener用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
  4、如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。

  MVP的缺点

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

from 点击打开链接

MVP -----个人理解与示例(android例子 实现)相关推荐

  1. 深入理解gradle编译-Android进阶篇

    2019独角兽企业重金招聘Python工程师标准>>> 9/27/2016 4:23:23 PM 深入理解gradle编译-Android进阶篇 导读 本文旨在介绍Gradle构建的 ...

  2. MVP模式理解与使用

    目录 1.为什么使用MVP模式 1.1实例说明 2.如何使用MVP模式 2.1MVP实现之拆分 2.2MVP实现之接口通信 2.3MVP实现之功能仓库 3.MVP模式的优缺点 1.为什么使用MVP模式 ...

  3. Golang的反射reflect深入理解和示例

    [TOC] Golang的反射reflect深入理解和示例 [记录于2018年2月] 编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机 ...

  4. TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅

    TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅读 ...

  5. 如何将android例子程序添加到Eclipse进行调试运行

    website:http://blog.csdn.net/whwzm88/article/details/6342583 1.打开Eclipse,选择File->new->Android ...

  6. Android —MVP架构—登录页面示例

    1.MVP的诞生 以下内容都是从安卓的角度分析: 首先要了解什么是MVC架构: 图片来源网络 View:对应XML文件及Activity或fragment,因为许多修改视图的操作在Activity中实 ...

  7. 【译】使用Kotlin和RxJava测试MVP架构的完整示例 - 第1部分

    原文链接:android.jlelse.eu/complete-ex- 最近我创建了一个playground项目来了解更多关于Kotlin和RxJava的信息. 这是一个非常简单的项目,但有一部分,我 ...

  8. android中的mvp模式怎么定义,在android中使用MVP模式

    1.MVP介绍java 随着UI建立技术的功能日益加强,UI层也履行着愈来愈多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专一于处理数 据的可视化以及与用户的交互,同时 ...

  9. android桌面widget怎么设置它大小与屏幕同宽啊,理解与应用Android桌面组件AppWidget...

    一.概念 首先要区分widget和AppWidget这两个概念. 1.Widget widget可以直译为小部件,它在Android中代表视图的概念,如TextView.Button.EditText ...

最新文章

  1. 【NLP】 NLP领域最具影响力的国内外会议介绍
  2. Hadoop 2.0安装以及不停集群加datanode
  3. MVP on Board 没用小技巧
  4. js map遍历 修改对象里面的值_js中那些方法不改变原来的数组对象
  5. 向别人网页注入js_区块链研究实验室 | Web3 .js基于以太坊的Javascript API
  6. php访问url的四种方式
  7. JavaScript进阶高级
  8. nuxt SSR部署到iis7方案
  9. 项目文档:IT项目管理
  10. Java入门-换行输出
  11. 冠军团队访谈录|第三届全国人工智能大赛
  12. 星巴克中国咖啡创新产业园正式动工,追加项目总投资至近11亿元
  13. python绘制对数函数
  14. js进栈出栈_JavaScript js调用堆栈(一)
  15. 开源 chatgpt 项目私有化部署
  16. 数字电子技术复习第一章
  17. day46--快速排序
  18. 川轻化c语言实验答案,计算机二级c语言第4套笔试模拟试卷.doc
  19. android纯净版输入法,Android输入法爬坑记
  20. 《遗传算法原理及应用》笔记—进化计算

热门文章

  1. 莱佛士毕业生 Amos YEO与快餐巨头KFC街头服饰合作系列
  2. H---RGB色彩图像分析
  3. 机器学习画图工具(1)
  4. 100个最佳linux站点(转贴)
  5. 七牛云与复旦大学计算机合作,复旦大学教授薛向阳:校企合作在视觉内容识别技术方面取得显著成果...
  6. 免费使用office365和5TOneDrive空间
  7. 机器学习_深度学习毕设题目汇总——人脸A
  8. 狄兰·托马斯诗合集▷Do not go gentle into that good night
  9. 计算机网络基本实训报告,计算机网络实训报告.doc
  10. 特斯拉自动驾驶使用的技术_为什么特斯拉不会使用激光雷达