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;//用于实现监听,    @Override    protected 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中的方法的重载。。我觉得是控件与方法的联系    @Override    public void setClickText(String clickText) {            button.setText(clickText);    }    @Override    public void setMess(String  s,String ss) {             textview.setText(s+" "+ss );    }    @Override    public void setClickHappen(buttonlisten Listener ) {        myListener=Listener;    }    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    @Override    public 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;    }    @Override    public 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  点击打开链接


更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. android工程下轻松运行java main程序
  5. Android(安卓)代码混淆 选项说明
  6. Android(安卓)获取控件宽高的3种方法
  7. Android中创建与几种解析xml的方法!
  8. android webview 面试
  9. Android系列之浅谈Android(安卓)3D旋转

随机推荐

  1. Android高手进阶教程(二)之----Android L
  2. Myeclipse 安装时候android adt, android
  3. Mediapipe框架在Android上的使用
  4. Mac上非常好用的免费的Android文件传输工
  5. android:ToolBar详解
  6. Android面试必备——AsyncTask源码解析
  7. Android(安卓)SDK Samples,学习Android的
  8. 关于Android(安卓)Studio building卡死的
  9. Android遍历获取Office格式(Word,Excel,PPT,P
  10. android Map 使用方法