MVP 模式的核心思想
MVP 把 Activity 中的 UI 邏輯抽象成 View 接口,把業(yè)務(wù)邏輯抽象成 Presenter 接口,Model 類還是原來(lái)的Model。
簡(jiǎn)單來(lái)說(shuō) : 就是把UI部分和事件處理的邏輯抽離出來(lái),Activity中把View和Control抽離開,降低耦合性. 達(dá)到松散耦合的效果,也方便移植和測(cè)試
M:Mode javaBean
V:View UI
P:presenter 提出者,任命者,主持人
基本MVP
- View和Presenter之間的協(xié)議IContract.java
// Contract
public interface IContract {
interface View {
void updateBtnText(String s);
void showToast(String s);
}
interface Presenter {
/**
* 調(diào)用該方法表示presenter被激活了
*/
void start();
void loadClickString();
/**
* 調(diào)用此方法表示presenter要結(jié)束了
* 其目的是為了接觸相互持有導(dǎo)致的內(nèi)存泄露
*/
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);
// 在最開始的時(shí)候構(gòu)建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() {
// 在這里,
// 我們可以去數(shù)據(jù)庫(kù)中查找數(shù)據(jù),
// 也可以去網(wǎng)絡(luò)中獲取數(shù)據(jù)
return "I am from ModelDataSource";
}
public String getBtnClickData() {
// 在這里,
// 我們可以去數(shù)據(jù)庫(kù)中查找數(shù)據(jù),
// 也可以去網(wǎng)絡(luò)中獲取數(shù)據(jù)
return "Hello MVP!";
}
}
參考: 淺談Android中的MVP與動(dòng)態(tài)代理(講的很詳細(xì))