首先来说一下MVC和MVP的区别:
MVC(Model-View-Controller),这种模式下三种模型的交互关系如下:
缺点:view可以直接访问model(比如我们经常在activity中直接操作SQLite、SharedPreference中的数据),同时view中可能会包含业务逻辑(比如我们经常把一个点击事件的处理写在activity里,这样就使得view层和controller层混在一起,使得view无法重用)。尽管MVC的提出旨在使程序的数据和页面分离,通过controller去控制二者之间的联系,但实际view仍是依赖model的,而且view和controller耦合不清。
MVP(Model-View-Presenter),这种模式解决了MVC的两个缺点,它的三种模型交互关系如下:
view和model之间完全切断了联系,对model的操作完全放在了presenter里;view不再包含任何逻辑的处理,所有逻辑完全交给presenter。这样对于相同的业务逻辑但不同的界面,presenter就可以复用;相同的页面、不同的业务逻辑实现,view就可以复用。这种模式使得view的作用仅仅只是显示页面,它不能获取或操作数据、不能包含对逻辑的处理。
通过上述分析,MVP和MVC之间的区别就是:在MVP中,View与Model并不直接交互,所有的交互放在Presenter中;而在MVC里,View与Model会直接产生一定的交互。
下面通过一个特别简单的demo来理解一下MVP的原理,demo的功能是:点击Button会生成一个随机数,在TextView中显示出来。
<span style="font-family:Arial;">public class Contract {
public interface View{
void setText(String str);
}
public interface Presenter{
void getRandomInt();
}
}
public class MainActivity extends Activity implements Contract.View{
TextView tv;
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getPresenter().getRandomInt();
}
});
}
private Contract.Presenter getPresenter(){
return new MyPresenter(this);
}
@Override
public void setText(String str) {
tv.setText(str);
}
}
public class MyPresenter implements Contract.Presenter{
private Contract.View mView;
public MyPresenter(Contract.View view){
mView = view;
}
@Override
public void getRandomInt() {
mView.setText("" + new Random().nextInt(100));
}
}</span>