概述
MVP(Model-View-Presenter)分层框架模式,它是Android逻辑交互框架中比较重要的一个。其中M V P具体的意义说明如下。
- Model: 模型层,作为功能模型。它主要做负责各类具体的操作,比如存取数据、接口调用等等;
- View: 视图层,这一点和MVC基本没有差别,代表着布局和控件;
Presenter: 主持层,作为M和V的中介,它主持着View与Model之间的交互。
MVP框架的主要特点是视图层和功能层完全隔离,二者的交互完全通过主持层。这样做减少了Activity中的臃肿代码,也使得Activity保持简洁明了。
代码举例
这里举一个最简单的例子,以登录操作为例。情形是这样的:点击activity中的一个登录按钮执行具体的登录操作。
【Model层】
/**
* Model层 接口
* 内部封装一个登录方法(这里只是举一个最简单的例子,不写登录回调了)
* Presenter层就是通过这个方法调用Model层的
*/
public interface LoginBaseModel {
void doLogin(String name, String password);
}
/**
* 具体的Model层实现类
* 负责执行具体从登录操作
*/
public class LoginConcreteModel implements LoginBaseModel {
@Override
public void doLogin(String name, String password) {
//TODO 登录操作
}
}
【Presenter层】
/**
* Presenter层 接口
* 封装了登录方法(对View层公开)
*/
public interface LoginBasePresenter {
void doLogin(String name, String password);
}
/**
* Presenter层 实现类
* 该类汇聚了Model层和View层对象,在需要处调用即可
*/
public class LoginConcretePresenter implements LoginBasePresenter {
private LoginBaseModel mLoginBaseModel;//引用了Model层的对象,在需要时调用
private LoginView mLoginBaseView; //引用了View层的对象
public LoginConcretePresenter(LoginView loginView) {
this.mLoginBaseModel = new LoginConcreteModel();
this.mLoginBaseView = loginView;
}
/**
* 执行登录
* 该方法分别调动了Model层和View层的方法
* @param name
* @param password
*/
@Override
public void doLogin(String name, String password) {
mLoginBaseView.showProgress(true);
mLoginBaseModel.doLogin(name, password);
}
}
【View层】
/**
* View层 接口
* 该类简单封装了一个方法
* Presenter层就是通过该方法对View层进行控制的
*/
public interface LoginView {
void showProgress(boolean visible);
}
public class LoginActivity extends Activity implements LoginView {
private LoginBasePresenter mLoginBasePresenter;
private Button submit;
private EditText username;
private EditText password;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initVariables();
initViews();
}
private void initVariables() {
mLoginBasePresenter = new LoginConcretePresenter(this);
}
private void initViews() {
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
submit = (Button) findViewById(R.id.submit);
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mLoginBasePresenter.doLogin(username.getText().toString(), password.getText().toString());
}
});
}
@Override
public void showProgress(boolean visible) {
}
}