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