一、介紹 MVP(Model View Presenter)架構是從著名的MVC(Model View Controller)架構演變而來的。對於在Android應用中開發就可以視為是MVC架構,佈局文件視為View,Activity視為Controller,但是Activity還要控制佈局的更新, ...
一、介紹
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