淺析MVC和MVP

MVC

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫。

  • 模型(Model)主要做一些業務邏輯處理,比如數據庫存取,網絡操作,複雜算法,耗時任務。
  • 視圖(View)主要是用來顯示Model的數據結果,Android主要是指XML佈局。
  • 控制器(Controller)處理用戶交互部分,可以將Activity看做是控制器。通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。
    這裏寫圖片描述

這幅圖表示了Controller從View讀取數據後,傳遞給Model,Model將結果返回給View。Controller起到了中間橋樑的作用,控制View和Model兩者之間的通信。

通過MVC模式,我們可以將界面層和和業務層分離開,讓他們各司其職。

但是Activity中有很多關於視圖UI的顯示代碼,因此View視圖和Activity控制器並不是完全分離的,一部分的View存在於Controller中。

當項目不是很龐大時,使用MVC框架模式是比較理想的,能夠方便我們維護。但是當App逐漸變大,就應該使用MVP了。


MVP

MVP是模型(Model),視圖(View),控制者(Presenter)的縮寫。

  • 模型(Model):數據層,他負責對數據的存取。例如數據庫的讀寫,網絡數據的請求。
  • 視圖(View):負責界面數據的顯示以及用戶的交互。通常爲Activity或者Fragment作爲View層。
  • 控制者(Presenter):將模型與視圖分離開,是模型和視圖之間的橋樑。

這裏寫圖片描述

從圖中我們可以看出,MVP架構中,Model無法與View直接交互,Presenter會從Model獲取所需要的數據,進行適當處理後交給View層顯示。這種方式View和Model不再耦合,同時業務邏輯也從圖形界面中抽離出來了。

Presenter存在Model和View的接口,View中也會持有一個Presenter成員變量,並且保留Presenter接口的調用。

下面是一個簡單的邏輯例子,並不是完整的代碼,闡述的是Presenter從界面中獲取了下載的網址,然後調用Model去下載,同時讓View顯示正在下載的對話框。

//Model
public interface IModel{
    void load(String str);
public class ModelImpl implements IModel{
public void load(String str){//從網絡中下載數據
    ......}
}
}

//Presenter
public interface IPresenter{
    void getInfo(String str);   
}

public class PresenterImpl implements IPresenter{
    //IView的接口
    IView  view;
    //IModel的接口
    IModel model;

    public PresenterImpl(IView view){
        this.view = view;
}
    public void getInfo(String str){
    view.showLoading();//界面顯示正在下載
    model.load(str);//model從網絡中下載數據
}
} 

//IView
public interface IView{
    void showLoading();

}


public calss MainActivity extends Activity implements IView{
    IPresenter presenter;
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();//初始化
}

public void init(){
    btn = (Button)findViewById(R.id.btn);
    presenter = new PresenterImpl (this);

    btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //獲取網址
                presenter.getInfo(editText.getText().toString());
            }
        });
}

  @Override  
public void showLoading() {  
        loadingDialog.show();  //使用對話框顯示正在下載的進度
    }  

}

MVP框架模式將Model模型和View視圖分離,從而使得代碼的耦合度低,利用MVP框架寫項目達到解耦作用。

MVC和MVP的最大的區別就是:
MVC中View和Controller的關係比較緊密。而MVP中兩者完全分離。在Android中的MVP框架,Activity擔當了View視圖層,MVC框架中Activity擔當控制器。

MVP可以達到很好的解耦作用,但是比較複雜,比較適合開發較大的項目。如果項目較小,建議使用MVC。

以上就是我對MVC和MVP的理解所做的筆記。

參考:
http://blog.csdn.net/gjnm820/article/details/51733361
http://blog.csdn.net/ljd2038/article/details/51477475

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章