一、MVP介绍
在开发的过程中如果一个Activity的功能比较多或者比较集中的时候,代码可能会写的非常的长,这个会使我们在维护代码的过程异常的艰难。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生。
一下为MVP模式中的主要的元素
(1)View:主要负责UI的绘制以及用户交互的实现;
(2)View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
(3)Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
(4)Presenter:作为View与Model交互的中间纽带,负责数据数据处理与一些逻辑的实现。
(参考:http://blog.csdn.net/vector_yi/article/details/24719873)
二、MVP对比MVC
劣势:
代码复杂度增高,开发成本较高;
优势:
1.代码结构清晰
2.代码耦合度低
3.代码复用性高
4.利于单元测试
三、样例代码
1.首先建立存储数据的bean
public class UserBean {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.然后建立model
public interface IUserModel {
void setAge(int id);
void setName(String name);
UserBean load(String name);
}
之后建立UserModel实现model接口
public class UserModel implements IUserModel {
private List<UserBean> list=new ArrayList<>();
private UserBean userBean=new UserBean();
@Override
public void setAge(int age) {
userBean.setAge(age);
save();
}
@Override
public void setName(String name) {
userBean.setName(name);
save();
}
private void save(){
//这里可以与数据库连接或者连接本地存储的数据
if (userBean.getAge()!=0&&userBean.getName()!=null){
list.add(userBean);
userBean=new UserBean();
}
}
@Override
public UserBean load(String name) {
//这里可以与数据库连接或者连接本地存储的数据
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getName().equals(name)){
return list.get(i);
}
}
return null;
}
}
3.建立Presenter
public class UserPresenter {
//presenter可以写一些与model连接的逻辑,及方法
private IUserView iUserView;//与view交互
private IUserModel iUserModel;//与model交互
public UserPresenter(IUserView iUserView) {
this.iUserView = iUserView;
this.iUserModel= new UserModel();
}
public void saveUser(int age,String name){
iUserModel.setAge(age);
iUserModel.setName(name);
}
public void loadUser(String name){
UserBean user=iUserModel.load(name);
//处理view的相关UI
iUserView.setAge(user.getAge());
iUserView.setName(user.getName());
}
}
3.建立view
首先建立view接口,包涵view中需要处一些与数据相关的控件的接口
public interface IUserView {
int getAge();
String getName();
void setAge(int age);
void setName(String name);
}
之后在view层中实现这个接口
public class MainActivity extends Activity implements View.OnClickListener,IUserView{
private UserPresenter userPresenter;
private EditText name;
private EditText age;
private Button submit;
private Button find;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
name= (EditText) findViewById(R.id.name);
age= (EditText) findViewById(R.id.age);
submit= (Button) findViewById(R.id.submit);
find= (Button) findViewById(R.id.find);
userPresenter=new UserPresenter(this);
submit.setOnClickListener(this);
find.setOnClickListener(this);
}
@Override
public int getAge() {
return new Integer(age.getText().toString());
}
@Override
public String getName() {
return name.getText().toString();
}
@Override
public void setAge(int age) {
this.age.setText(age+"");
}
@Override
public void setName(String name) {
this.name.setText(name);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.submit:
userPresenter.saveUser(getAge(),getName());
break;
case R.id.find:
userPresenter.loadUser(getName());
break;
default:
break;
}
}
}
从上面中activity中的代码可以看出,我们在view中只是处理一些UI相关的展示,把所有的与model相关的逻辑处理全部都交给Presenter来做,presenter处理完数据通过iUserView来实现数据的显示。这样就大大的减轻了view的负担,代码的耦合性也更低。
总的来看MVP模式就是在model层抽取出一个接口,在view层中抽取出一个接口,连个接口来控制view或者是model都能干些什么,这使代码结构更加清晰,让后presenter在view和model中间实现连接的作用并处理一些逻辑,实现代码解耦。这样对比MVC,view就不直接与model交互减轻了view的压力。
以上就是博主对MVP模式的一些浅薄的理解,有什么有问题的地方,希望小伙伴们能及时指出,以便博主及时修改。