一 、MVC和MVP简介
在介绍MVP之前先来介绍下MVC,MVC(Model-View-Controller)。框架模式是Android中常用的框架模式,为了分离数据,逻辑和视图。
工作流程:View把用户操作交给Controller,Controller处理后传达给Model,Model获取数据并交给View,View更新数据。
MVC在一定程度上降低了程序的耦合度,但是View和Controller分层不是很明确,Activity可以说是Controller,但是其中又包含了和View相关的信息,Activity也是View的一部分。并且View依赖Model,但是Model不依赖于View。
MVP框架模式是对MVC的改进,MVP(Model-View-Presenter)将View和Model完全隔离。其中Presenter代替了Controller,充当View和Model之间的桥梁。
工作流程:View将用户操作交给Presenter,Presenter处理后传达给Model,Model获取数据,并交给Presenter,Presenter处理后交给View,View更新数据。
MVP实现了View与Model的完全隔离,通过面向接口的编程,进一步降低了程序的耦合性。层次清晰同时Presenter的任务也较重,MVP实现起来要比MVC复杂,其中各种接口回调也是需要一个清晰的思路。
二、怎样写一个MVP
相比MVC,MVP的层次分明,但是写起来比MVC复杂些。
接下来通过一个Demo来呈现出来,首先看我们的项目的目录结构,进行分层。
前面我们也说了,MVP完全隔离了View和Model,Presenter是两者之间的桥梁,耦合性较低,采用面向接口的编程。所以我们首先要在View和Model中定义两个接口,用来给Presenter提供操作它们的通道,通过回调机制实现数据的传递。
我们先来看Model
首先定义一个接口
public interface IGetData {
String getData();
void saveData(String data);
}
当然只有接口是没用的,我们得去实现这个接口,并重写方法。
public class MyGetData implements IGetData {
@Override
public String getData() {
// 这里可以进行一系列的数据获取操作
String data="chendicumt";
return data;
}
@Override
public void saveData(String data) {
// 这里可以进行一系列的数据保存操作
Log.d("------->",data);
}
}
接下来是定义View的接口
public interface IGetDataView {
void showViewData(String data);
String getViewData();
}
实现View接口
public class MainActivity extends AppCompatActivity implements IGetDataView{
private EditText editText;
private Button button;
private GetDataPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText=(EditText)findViewById(R.id.edit_text);
button=(Button)findViewById(R.id.button);
presenter=new GetDataPresenter(this);
presenter.showData();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
presenter.saveData();
}
});
}
@Override
public void showViewData(String data) {
editText.setText(data);
}
@Override
public String getViewData() {
return editText.getText().toString();
}
}
我们可以了看到以上代码中出现了Presenter相关的信息,这里是为了实现View接口的回调,用来传递数据。
来看看Presenter的实现
public class GetDataPresenter {
IGetData iGetData;
IGetDataView iGetDataView;
public GetDataPresenter(IGetDataView iGetDataView)
{
this.iGetDataView=iGetDataView;
iGetData=new MyGetData();
}
public void saveData()
{
iGetData.saveData(iGetDataView.getViewData());
}
public void showData()
{
iGetDataView.showViewData(iGetData.getData());
}
}
在Presenter中,相当于把View接口的地址放进来,同时又实现了调用Model接口,体现出桥梁的作用。
学习过程中也出现过思路不清晰的情况,多思考理一理就明白了。