當前位置:首頁 > 資訊 > info6 > 正文

MVP -----個人理解與示例(android例子 實現)

發表于: 2014-05-02   作者:chen_xinjia   來源:轉載   瀏覽:
摘要: MVP也就是ModelViewPresenter模式,是建立一個工程的一種模式。?===================================================================================================================以下只是基于這個貼子中的例子來說。。只是非常初級的用法和理解==============

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 點擊打開鏈接


MVP -----個人理解與示例(android例子 實現)

版權所有 IT知識庫 CopyRight ? 2009-2015 IT知識庫 IT610.com , All Rights Reserved. 京ICP備09083238號
广东25选5开奖结果