MVP架構,mvp架構android

來源:互聯網
上載者:User

MVP架構,mvp架構android
一、介紹

  MVP(Model View Presenter)架構是從著名的MVC(Model View Controller)架構演變而來的。對於在Android應用中開發就可以視為是MVC架構,布局檔案視為View,Activity視為Controller,但是Activity還要控制布局的更新,所以說Activity是Controller與View的合體,這樣的結果是Actiivty的代碼很多也很雜亂,而MVP就是將Activity充當的Controller與View的角色分割開來。
  View:對於View層也是視圖層,在View層中只負責對資料的展示,提供友好的介面與使用者進行互動。在Android開發中通常將Activity或者Fragment作為View層。
  Model:對於Model層也是資料層。它區別於MVC中的Model,在這裡不僅僅只是資料模型。在MVP架構中Model它負責對資料的存取操作,例如對資料的讀取,網路的資料請求等。
  Presenter:對於Presenter層也是串連View層與Model層的橋樑並對商務邏輯進行處理。在MVP架構中Model與View無法直接進行互動。所以在Presenter層它會從Model層獲得所需要的資料,進行一些適當的處理後交由View層進行顯示,這樣通過Presenter將View與Model進行隔離,使得View和Model之間不存在耦合,同事也將商務邏輯從View中抽離。

  在MVP架構中將這三層分別抽象到各自的介面當中。通過介面將層次之間進行隔離,而Presenter對View和Model的相互依賴也是依賴於各自的介面。這點符合了介面隔離原則,也正是面向介面編程。在Presenter層中包含了一個View介面,並且依賴於Model介面,從而將Model層與View層聯絡在一起。而對於View層會持有一個Presnter成員變數並且只保留對Presenter介面的調用,具體商務邏輯全部交由Presnter介面實作類別中處理。

二、好處

  1.View與Model並不直接進行互動,而是通過Presenter串連彼此。View中不存在Model,從而也不會存在商務邏輯。
  2.Presenter與View的互動式通過介面來實現的,耦合度低,也有利於單元測試。
  3.Presenter是基於行為的,一個Presnter可用於多個View,增強了代碼複用。

三、使用

  使用MVP架構來實現一個ListView的顯示。
  1.定義一個Mode介面

public interface IMode {    List<String> getDatas();}

  2.定義一個IView介面

public interface IView {    void showProgress();    void hideProgress();    void showText(String text);    void showDatas(List<String> datas);    void showToast(String message);}

  3.定義一個Presenter介面

public interface IPresenter {    void getDataList();    void onItemClick(int position);}

  4.定義MainMode類實現IMode介面

public class MainMode implements IMode {    @Override    public List<String> getDatas() {        List<String> datas = new ArrayList<>();        //return datas;        datas.add("A");        datas.add("B");        datas.add("C");        datas.add("D");        datas.add("E");        datas.add("F");        return datas;        //return null;    }}

  5.定義MainPresenter類實現IPresenter介面

public class MainPresenter implements IPresenter {    private IView mView;    private IMode mMode;    public MainPresenter(IView mView) {        this.mView = mView;        mMode = new MainMode();    }    @Override    public void getDataList() {        mView.showProgress();        new Handler().postDelayed(new Runnable() {            @Override            public void run() {                List<String> datas = mMode.getDatas();                mView.hideProgress();                if (datas == null) {//擷取資料失敗                    mView.showText("請求資料失敗!");                } else {//擷取資料成功                    if (datas.size() == 0) { //資料為空白                        mView.showText("資料為空白!");                    } else {                        mView.showDatas(datas);                    }                }            }        }, 2000);    }    @Override    public void onItemClick(int position) {        mView.showToast(String.format("Position %d clicked", position + 1));    }}

  6.定義MainActivity類實現IView介面

public class MainActivity extends AppCompatActivity implements IView, AdapterView.OnItemClickListener {    private ListView mListView;    private ProgressBar mProgressBar;    private TextView mTextView;    private IPresenter mPresenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView = (ListView) findViewById(R.id.list);        mProgressBar = (ProgressBar) findViewById(R.id.progress);        mTextView = (TextView) findViewById(R.id.text);        mPresenter = new MainPresenter(this);        mPresenter.getDataList();    }    @Override    public void showProgress() {        mProgressBar.setVisibility(View.VISIBLE);        mListView.setVisibility(View.GONE);    }    @Override    public void hideProgress() {        mProgressBar.setVisibility(View.GONE);        mListView.setVisibility(View.VISIBLE);    }    @Override    public void showText(String text) {        mProgressBar.setVisibility(View.GONE);        mListView.setVisibility(View.GONE);        mTextView.setVisibility(View.VISIBLE);        mTextView.setText(text);    }    @Override    public void showDatas(List<String> datas) {        mListView.setAdapter(new ArrayAdapter<>(this, R.layout.simple_list_item, datas));    }    @Override    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        mPresenter.onItemClick(position);    }    @Override    public void showToast(String message) {        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();    }}


代碼地址:https://github.com/ZhangMiao147/FrameworkDemo

 

參考文章
  http://www.lai18.com/content/7010875.html
  http://www.lai18.com/content/2453405.html
  http://www.lai18.com/content/475341.html
  http://www.lai18.com/content/24630178.html
  http://www.lai18.com/content/719388.html
  http://www.lai18.com/content/7017296.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.