MVC架构属于传统模式,在团队合作开发中最常用的就属MVP了,谷歌官方也提供了参考demo可见其重要之程度。
MVP相比较于MVC优点有哪些:
- 低耦合,Controller层不在混合有View层的逻辑
- MVP是面向接口编程,对于代码量较大的APP来说,相比较合作开发的优势就体现出来了,每个人或每个团队只负责一块逻辑,责任分明
- 在MVP架构中,View层和Model层不直接交互,而Presenter层持有View层和Model层的逻辑,Presenter充当作为中间人角色,为二者提供逻辑处理
- 在View层(通常是Activity中)拿到Presenter的对象,而Presenter持有Model层的对象,并从Model层取到数据,传递给View
缺点:
- Model进行异步操作,获取结果通过Presenter回传View时,可能会出现View引用的空指针
- Presenter和View互相持有引用,解除不及时会造成内存泄漏
- 因此,在进行MVP架构设计时需要考虑Presenter对View进行回传时,View是否为空
下面是代码实现一个简单的MVP架构:
思路:当点击View中的一个按钮时,Model层给View传递一个String类型的字符串
1、定义出所MVP架构可能用到的所有接口
public interface TestContract{
interface Presenter{
void getInfo();//获取数据方法
}
interface View{
void showInfo(String str);//显示数据方法
}
interface Model{
String serveInfo();//提供数据方法
}
}
2、实现Presenter(所有的业务操作都在Presenter的实现类中来完成,一来方便后期管理和维护,而是方便后期功能的增删)
public class PresenterImpl implements TestContract.Presenter{
TestContract.View view;
TestContract.Model model;
public PresenterImpl(TestContract.Model model,TestContract.View view){
this.view=view;
this.model=model;
}
@Override
public void getInfo(){
view.showInfo(model.serveInfo());
}
}
3、实现Model层,同时获取数据
public class ModelImpl implements TestContract.Model{
TestContract.Model model;
public static ModelImpl getInstance(){
if(model==null){
model=new ModelImpl();
}
return model;
}
@Override
public String serveInfo(){
return "transport info";
}
}
3.View层的代码逻辑,在Activity中实现View层接口,拿到Presenter的引用从而获取Model的数据
public class TestActivity extends AppCompatActivity implements TestContract.View{
private TestContract.Presenter presenter;
public PresenterImpl(ModelImpl.getInstance,this);
//按钮的点击事件逻辑处理
public void onClick(View view){
presenter.getInfo();
}
@Override
public void showInfo(String str){
tv.setText(str);
}
}
以上是MVP架构的基本用法,在实际工程中,Model层不是必须的,但是一定得有Presenter跟View
在后续开发中,Model层中可以有多种获取数据的方法(或者写出多个Model层,用以处理不同类型的数据),Presenter中可以有实现的多个方法用以持有不同Model的不同方法(或者同一Model的不同方法),总之就是不要将View与Model直接交互即可。