MVP架構

1、介紹

  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中抽離。html

  在MVP架構中將這三層分別抽象到各自的接口當中。經過接口將層次之間進行隔離,而Presenter對View和Model的相互依賴也是依賴於各自的接口。這點符合了接口隔離原則,也正是面向接口編程。在Presenter層中包含了一個View接口,而且依賴於Model接口,從而將Model層與View層聯繫在一塊兒。而對於View層會持有一個Presnter成員變量而且只保留對Presenter接口的調用,具體業務邏輯所有交由Presnter接口實現類中處理。git

2、好處

  1.View與Model並不直接進行交互,而是經過Presenter鏈接彼此。View中不存在Model,從而也不會存在業務邏輯。
  2.Presenter與View的交互式經過接口來實現的,耦合度低,也有利於單元測試。
  3.Presenter是基於行爲的,一個Presnter可用於多個View,加強了代碼複用。github

3、使用

  使用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接口ide

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接口post

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

相關文章
相關標籤/搜索