浅析MVC和MVP

来源:互联网 发布:中文域名不流行 编辑:程序博客网 时间:2024/05/17 22:54

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显示正在下载的对话框。

//Modelpublic interface IModel{    void load(String str);public class ModelImpl implements IModel{public void load(String str){//从网络中下载数据    ......}}}
//Presenterpublic 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从网络中下载数据}} 
//IViewpublic 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

原创粉丝点击