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。

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

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

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

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

  1. package com.example.myapplication2.app;
  2.  
  3. /**
  4. * Created by XJ on 2014/5/1.
  5. * 整个工程的数据存放类
  6. */
  7. public class model
  8. {
  9. private final String name="I";
  10. private final String motto=" have clicked it ! ";
  11. private final String tip="click me!";//button 上显示的提示
  12.  
  13. //获取数据的方法
  14. public String GetName(){return name;}
  15. public String GetMotto(){return motto;}
  16. public String GetTip(){return tip;}
  17.  
  18. }

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

  1. package com.example.myapplication2.app;
  2.  
  3. /**
  4. * Created by XJ on 2014/5/1.
  5. * 在presenter中实现把model层的信息放入界面
  6. */
  7. public class presenter {
  8. view myView;
  9.  
  10. presenter(view inView)
  11. {
  12. bind(inView);//传入要实现的view
  13. }
  14. void bind(view inView)//将数据与view结合起来
  15. {
  16. final model myModel=new model();//定义一个数据类
  17. myView=inView;
  18. myView.setClickHappen(new buttonlisten() {
  19. public void click()//按钮事件的核心
  20. {
  21. myView.setMess(myModel.GetName(),myModel.GetMotto());//实现在onclick中
  22. }
  23. }
  24. );
  25. myView.setClickText(myModel.GetTip());//会到实现类中将对应的方法实现
  26. myView.setMess("button is"," unclicked");//会到实现类中将对应的方法实现,一开始设置textview中的信息,也可不要
  27. }
  28.  
  29. }

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

  1. package com.example.myapplication2.app;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.support.v7.app.ActionBarActivity;
  6. import android.view.Menu;
  7. import android.view.MenuItem;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.TextView;
  11.  
  12. //这个类通过 生成 view presenter model 来实现一个应用
  13. public class hello extends ActionBarActivity implements view{
  14.  
  15.     Button button;
  16.     TextView textview;
  17.     buttonlisten myListener;//用于实现监听,
  18.     @Override
  19.     protected void onCreate(Bundle savedInstanceState) {
  20.         super.onCreate(savedInstanceState);
  21.         setContentView(R.layout.mainxml);
  22.         button = (Button) findViewById(R.id.button);
  23.         textview  = (TextView) findViewById(R.id.textview);
  24.          new presenter(this);
  25.         button.setOnClickListener(new View.OnClickListener() {//点击按钮才会触发
  26.             public void onClick(View arg0) {
  27.                 myListener.click();
  28.             }
  29.         });
  30.     }
  31.     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  32.     ///////////////这现就是实现view中的方法的重载。。我觉得是控件与方法的联系
  33.     @Override
  34.     public void setClickText(String clickText) {
  35.             button.setText(clickText);
  36.     }
  37.  
  38.     @Override
  39.     public void setMess(String  s,String ss) {
  40.              textview.setText(s+" "+ss );
  41.     }
  42.     @Override
  43.     public void setClickHappen(buttonlisten Listener ) {
  44.         myListener=Listener;
  45.     }
  46.     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47.     @Override
  48.     public boolean onCreateOptionsMenu(Menu menu) {
  49.         // Inflate the menu; this adds items to the action bar if it is present.
  50.         getMenuInflater().inflate(R.menu.hello, menu);
  51.         return true;
  52.     }
  53.  
  54.     @Override
  55.     public boolean onOptionsItemSelected(MenuItem item) {
  56.         // Handle action bar item clicks here. The action bar will
  57.         // automatically handle clicks on the Home/Up button, so long
  58.         // as you specify a parent activity in AndroidManifest.xml.
  59.         int id = item.getItemId();
  60.         if (id == R.id.action_settings) {
  61.             return true;
  62.         }
  63.         return super.onOptionsItemSelected(item);
  64.     }
  65. }

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

一开始真的觉得挺难理解的,直到意识到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基础篇

    深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...

  2. [原创]浅谈在创业公司对MVP的理解

    [原创]浅谈在创业公司对MVP的理解 目前自已所处的公司类似一个创业平台,我们内部会不断的去孵化不同方向的产品,产品经理经常谈到的一个词就是MVP,所以有必需要去了解下什么是MVP? 1 什么是MVP ...

  3. android开发-mvp模式理解

    看之前,先忘掉所有,一步步看就行了. 最后会有一个原型demo,当然是转的了.看完文章,再看demo,然后再回头看文章就很好理解了,最好自己写一遍. 1.mvp开发模式可以理解为页面接口编程,每一层的 ...

  4. mvp(2)一个简单示例,加深理解

    参考: http://www.cnblogs.com/liuling/p/mvp-pattern-android.html 架构图: 1.View层 public interface NewsView ...

  5. MVP 个人理解2

    根据我的理解,画了个图 这次又看了下 较复杂点的例子. 往往一个项目有多个部份,我们可以按功能分成几个activity, 每个activity有自己的view和数据model,因此也有自己的逻辑 pr ...

  6. 线程和线程池的理解与java简单例子

    1.线程 (1)理解,线程是系统分配处理器时间资源的基本单元也是系统调用的基本单位,简单理解就是一个或多个线程组成了一个进程,进程就像爸爸,线程就像儿子,有时候爸爸一个人干不了活就生了几个儿子干活,会 ...

  7. 如何使用MVP模式搭建我们的Android应用?

    听到很多人在讨论MVVM,我自己早些时候也写过一篇介绍MVVM的文章(玩转Android之MVVM开发模式实战,炫酷的DataBinding!),实际上,在Android开发领域中,除了MVVM之外, ...

  8. java-信息安全(六)-基于RSA理解数字签名示例

    概述 java-信息安全(四)-数据签名.数字证书 java-信息安全(五)-非对称加密算法RSA RSA工具类 使用java-信息安全(五)-非对称加密算法RSA项目中RSACoder 数字签名理解 ...

  9. 解决导入Android例子时“Unable to resolve target 'android-x' ”的错误

    今天导入一个Android的例子程序,出现了Unable to resolve target 'android-2' 的错误. 最后google之后才发现原来是 ADK版本 :---API Level ...

随机推荐

  1. HTML5本地存储之localStorage

    存入本地中:localStorage.setItem('Code',‘10001’) 获取:localStorage.getItem('Code')

  2. ios每日一发--Leanclude数据云存储以及登录 注册账户

    利用LeanCloud来实现注册账号,存储账号以及,登录时查询账号是否正确.集成方式很简单可以看这里的官方文档.地址是这里: https://leancloud.cn/docs/ 在这里创建应用,以及 ...

  3. python install (version problem-method ln -s)

    一般情况下,无需自己安装Python.因为在大多数Linux版本中,如Fedora,Ubuntu等,都已经默认安装了Python,但也可以根据需要自定义安装Python.下面使用源码编译安装来举个例子 ...

  4. http协议 301和302的原理及实现

    一.来看看官方的说法: 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:  301 redirect: 301 代表永久性转移(Permanently Moved) ...

  5. elasticsearch基础

    elastic使用lucene建立索引的步骤中,需要文件系统缓存需要同步到磁盘上.(多个segment->commit文件来维护) 当建立历史数据时,并不要求太高的实时性时,可以减小(默认1s) ...

  6. Magento 自定义一个搜索功能

    最近工作中有一个需求是需要做一个搜索的功能,但是因为需要定制一些外观,所以就不用传统的方法来继承基类GRID.实现这个需求的核心其实就是下面这个方法. $this->getLayout()-&g ...

  7. mysql部署到云主机的笔记

    写了个程序,需要把数据库部署到云主机上 MySQL基于安全考虑root账户一般只能本地访问,但是在开发过程中可能需要打开root的远程访问权限 为了安全,新添加一个用户来进行远程登录 登录MYSQL: ...

  8. PoE以太网远程供电

    每个以太网口向下挂设备提供的最大功率为 15.4W 通过3/5 类双绞线的信号线(1.3.2.6)同时传递数据和电流

  9. VM arguments

    VM arguments -Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxPermSize=512m

  10. 我的android学习经历36

    最近把android的基础知识都学的差不多了,也写了许多demo,就想自己写一个app,可是写到后面的时候发现很混乱,所以还是得写一些文档,用xml语言写一下基础的类以及一些其他的东西.所以要想写一个 ...