MVP 模式的核心思想
MVP 把 Activity 中的 UI 逻辑抽象成 View 接口,把业务逻辑抽象成 Presenter 接口,Model 类还是原来的Model。
简单来说 : 就是把UI部分和事件处理的逻辑抽离出来,Activity中把View和Control抽离开,降低耦合性. 达到松散耦合的效果,也方便移植和测试
M:Mode javaBean
V:View UI
P:presenter 提出者,任命者,主持人
基本MVP
- View和Presenter之间的协议IContract.java
// Contract
public interface IContract {
interface View {
void updateBtnText(String s);
void showToast(String s);
}
interface Presenter {
/**
* 调用该方法表示presenter被激活了
*/
void start();
void loadClickString();
/**
* 调用此方法表示presenter要结束了
* 其目的是为了接触相互持有导致的内存泄露
*/
void destroy();
}
}
View层ViewActivity.java:
// View
public class ViewActivity extends Activity implements IContract.View {
private Button mBtn;
private IContract.Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.Activity_view);
// 在最开始的时候构建presenter
mPresenter = new Presenter(this);
// View初始化
mBtn = (Button) findViewById(R.id.btn_hello_mvp);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.loadClickString();
}
});
}
@Override
protected void onStart() {
super.onStart();
mPresenter.start();
}
@Override
protected void onDestroy() {
if (mPresenter != null) {
mPresenter.destroy();
mPresenter = null;
}
super.onDestroy();
}
@Override
public void updateBtnText(String s) {
mBtn.setText(s);
}
@Override
public void showToast(String s) {
Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
}
}
Presenter层Presenter.java:
// Presenter
class Presenter implements IContract.Presenter {
private IContract.View mView;
Presenter(IContract.View view) {
mView = view;
}
@Override
public void start() {
String s = ModelDataSource.ins().getBtnText();
mView.updateBtnText(s);
}
@Override
public void loadClickString() {
String s = ModelDataSource.ins().getBtnClickData();
mView.showToast(s);
}
@Override
public void destroy() {
mView = null;
}
}
Model层ModelDataSource.java:
// Model
public class ModelDataSource {
private static ModelDataSource mInstance = null;
public static ModelDataSource ins() {
if (mInstance == null) {
synchronized (ModelDataSource.class) {
if (mInstance == null) {
mInstance = new ModelDataSource();
}
}
}
return mInstance;
}
public String getBtnText() {
// 在这里,
// 我们可以去数据库中查找数据,
// 也可以去网络中获取数据
return "I am from ModelDataSource";
}
public String getBtnClickData() {
// 在这里,
// 我们可以去数据库中查找数据,
// 也可以去网络中获取数据
return "Hello MVP!";
}
}
参考: 浅谈Android中的MVP与动态代理(讲的很详细)